Description

给出一个长度为N的由小写字母’a’~’z’和’*’组成的字符串A,一个长度为M的仅由小写字母’a’~’z’组成的字符串B。一个’*’可以匹配任意多个字符(包括0个)。求在B的所有循环同构串中,有多少个能够与A匹配。
循环同构串:就是把B的前k个字母(0<=k<M)移到结尾所得到的M个字符串。例如abc的循环同构串有abc、bca和cab。
A与B匹配:若除了A中的’*’号可以匹配B中的任意多个字符外,其余字符一一对应,则称A与B匹配。例如a*b*c与aadbc是匹配的,其中第一个*对应ad,第二个*对应空串。

Input

第一行为字符串A。
第二行为字符串B。

Output

输出在B的所有循环同构串中,有多少个能够与A匹配。

将B串倍长,将A串按通配符分割,分割后预处理每段在B串的匹配位置,枚举起始位置,强制要求A串首尾与起始、终止位置匹配,中间的段贪心取最左的,时间复杂度$O(nm)$
#include<cstdio>
#include<cstring>
char s1[],s2[],*ss[];
int l1,l2,sp=,ls[];
int nx[][],ans=;
int main(){
scanf("%s%s",s1+,s2+);
l1=strlen(s1+);
l2=strlen(s2+);
memcpy(s2+l2+,s2+,l2);
s1[]=s1[l1+]='*';
for(int i=;i<=l1+;++i)if(s1[i-]=='*'){
ss[sp]=s1+i;
while(ss[sp][ls[sp]]!='*')++ls[sp];
++sp;
}
--sp;
for(int i=;i<=sp;++i){
nx[i][l2*]=l2*;
for(int j=l2*-;j;--j){
nx[i][j]=memcmp(ss[i],s2+j,ls[i])?nx[i][j+]:j;
}
}
for(int i=;i<=l2;++i){
int mx=i+l2-ls[sp];
if(mx>&&nx[][i]==i&&nx[sp][mx]==mx){
int w=i;
for(int i=;i<sp&&w<=mx;++i)w=nx[i][w]+ls[i];
ans+=(w<=mx);
}
}
return printf("%d\n",ans),;
}

最新文章

  1. RAC 10.2.0.5,客户端登陆间断遭遇ORA-12545
  2. Java基本概念(1)什么是Java
  3. Delphi 10.1 Berlin UTF8String Test
  4. 【USACO1.1】Broken Necklace
  5. 黄聪:wordpress工作原理
  6. 查看BADI有哪些实现
  7. CAS Proxy 的相关文章
  8. Hadoop与HBase中遇到的问题
  9. Spring的后置处理器BeanPostProcessor
  10. sql server 高可用故障转移(3)
  11. [转]koa-router使用指南
  12. 变相实现textarea文本域
  13. 除了Udacity,全球最聪明的那群人还上哪些网站?
  14. svn Advanced
  15. Metrics.NET step by step使用Metrics监控应用程序的性能
  16. Majority Element(169) &amp;&amp; Majority Element II(229)
  17. Windows核心编程:第12章 纤程
  18. mysqlbinlog 查看mysql bin 日志 mysqlbinlog: unknown variable &#39;default-character-set=utf8&#39;
  19. knockout示例
  20. IOS马甲包(诚招大量开发)

热门文章

  1. 使用Git【转】
  2. ubinize的用法
  3. Cube Solution 2
  4. asp.net自定义控件之加载层
  5. Python内置函数(9)——callable--转载
  6. python find 返回元素的索引
  7. HTML DOM知识点补充:
  8. node+websocket创建简易聊天室
  9. bzoj 1318 [SPOJ744] Longest Permutation (排列)
  10. 052——VUE中使用vue-cli初始化单页面应用