#include<iostream> #include<string.h> #include<string> #include<stdio.h> #include<cstring> #define maxn 10000 using namespace std; int f[maxn]; void getfail(char *p,int *f){ int m=strlen(p); f[0]=0;f[1]=0; for(int i=1;i<m;i++){ int j=f[i]; while(j&&p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } int find(char* t,char* p,int* f){//t匹配串(主) p模式串(子) int n=strlen(t),m=strlen(p); getfail(p,f); int j=0; for(int i=0;i<n;i++){ while(j&&p[j]!=t[i])j=f[j]; if(p[j]==t[i])j++; if(j==m)return i-m+1; } return -1; } int main(){ char p[maxn]; char t[maxn]; cin>>p>>t; if(find(t,p,f)==-1){ puts("NO"); } else cout<<find(t,p,f)<<endl; }
如果对于next数组中的i,符合i%(i-next[i])==0&&next[i]!=0则说明字符串循环,而且循环长度为:i-next[i] 循环次数为:i/(i-next[i])。
abcd循环节长度为4 abca 3 aba 2 abab循环节长度2