#include <iostream> #include <cstring> #include <string> #include <vector> using namespace std; const int N = 1000002; int nextt[N]; int ex[N]; char S[N],T[N]; //vector<int>S,T; int slen, tlen; void getNext() { int j, k; j = 0; k = -1; nextt[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) nextt[++j] = ++k; else k = nextt[k]; } /* 返回模式串T在主串S中首次出现的位置 返回的位置是从0开始的。 */ char s1[N],s2[N]; void EXKMP() { int i = 0, j, po, len = strlen(s1), l2 = strlen(s2); getNext();//计算子串的next数组,先改动T为s1,tlen为strlen(s1); while(s1[i] == s2[i] && i < l2 && i < len) //计算ex[0] i++; ex[0] = i; po = 0; //初始化po的位置 for(i = 1; i < len; i++) { if(nextt[i - po] + i < ex[po] + po) //第一种情况,直接可以得到ex[i]的值 ex[i] = nextt[i - po]; else//第二种情况,要继续匹配才能得到ex[i]的值 { j = ex[po] + po - i; if(j < 0)j = 0; //如果i>ex[po]+po则要从头开始匹配 while(i + j < len && j < l2 && s1[j + i] == s2[j]) //计算ex[i] j++; ex[i] = j; po = i; //更新po的位置 } } } int KMP_Index(){//拓展KMP,求s1以i开始的后缀串与s2的最长前缀串长度 int i = 0, j = 0,ans=0;//ans=-1;//只计算一次位置时调用 getNext(); while(i < slen){ if(j == -1 || S[i] == T[j]){ i++; j++; }else j = nextt[j]; if(j == tlen){ //ans++,j=0;//语句1 //ans++,j=nextt[j];//语句2 //ans=i-j+1;break;//语句3 } } return ans; } int main() { int TT; int i, cc; while(1) { scanf("%s", S); scanf("%s", T); slen = strlen(S); tlen = strlen(T); cout<<KMP_Index()<<endl; }