HDU
来源:互联网 发布:js数组添加到指定位置 编辑:程序博客网 时间:2024/05/21 11:34
传送门
//题意: 问有多少个起点满足每次跳p个单位可以匹配下面那个子串.
//思路: 比较水的一个KMP变形. 每次我们跳k个单位进行kmp匹配就行了. 需要注意一点的但就是循环多少次了? 很显然的K次啊!!! 复杂度还是O(n+m)
AC Code
/** @Cain*/const int maxn = 1e6+5;int zc[maxn], pp[maxn];int Next[maxn];int n,m,cas=1;void getnext(int *s, int len) { int t1 = 0, t2; Next[0] = t2 = -1; while(t1 < len){ if(t2 == -1 || s[t1] == s[t2]) Next[++t1] = ++t2; else t2 = Next[t2]; }}int kmp(int *zc, int *pp, int len1, int len2,int flag,int strat) { int i = strat ,t = 0; int ans = 0; while(i<len1){ while (t != -1 && zc[i] != pp[t]) t = Next[t]; i+=flag; t++; if (t == len2) { ans++; t = Next[t]; } } return ans;}void solve(){ int k; Fill(Next,0); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%d",&zc[i]); for(int i=0;i<m;i++) scanf("%d",&pp[i]); getnext(pp,m); int ans = 0; printf("Case #%d: ",cas++); for(int i=0;i<k;i++){ ans += kmp(zc,pp,n,m,k,i); } printf("%d\n",ans);}
阅读全文
0 0