f数组即为next数组,表示回退位置和以当前为结尾匹配长度
# include <bits/stdc++.h>using namespace std;//字符串从0开始存储 next数组从1开始算起const int MAXN=1e3+100;int f[MAXN];char ch[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; } return ;}void 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) printf("%d\n",i-m+1); //P在T中出现的位置 } return ;}int main(){ cin>>ch; getFail(ch,f); printf("%d",f[strlen(ch)-1]); return 0;}