#include <iostream> #include <cstdio> #include <cstring> using namespace std; /** *计算next,其中next[0]=-1,next[1]=0; *next[j+1] = k+1 如果p[j]= p[next[j]] = p[k],这里k=next[j] k'+1或者0 如果p[j]!=p[next[j]]寻找k'=next[...next[k]...] */ void get_next(char *p,int *next) { int len = strlen(p); /** * 初始化k,i,next[0] */ int i = 0; next[i]=-1;//next[0]=-1 int k = -1;//k=next[0] while(i<len-1) { if(k== -1 || p[k] == p[i])//k==-1是为了保证next[1] = 0;p[k]==p[i],这里的k可能属于(1),这时next[i+1]=next[i]+1 //也可能属于情况(2),经过k=next[k]的递推,找到了k' { i++; k++; next[i] = k; } else { k = next[k]; } } } int index_kmp(char *t,char *p) { int n = strlen(t); int m = strlen(p); int next[100]; get_next(p,next); int i = 0; int j = 0; while(i<n && j<m) { if(j== -1 || t[i] == p[j])//j==-1是由于j = next[j]到了next[0] { i++; j++; } else { j = next[j]; } } if(j==m)//存在匹配 return i-m; else return -1;//不存在匹配 } int main() { char t[100]; char p[100]; scanf("%s",t); scanf("%s",p); cout << index_kmp(t,p)<<endl; }