基础KMP题,本文提供一段能AC并且便于调试以及查看next数组的代码。
参考博客
http://blog.csdn.net/v_july_v/article/details/7041827
http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html
#include<iostream> #include<cstring> using namespace std; ; int next[N]; char S[N],T[N]; //T为模式串,S为主串 int slen,tlen; // 第一步先学习写好这个函数 int KMP_Index() { ,j=; while(i<slen&&j<tlen) { ||S[i]==T[j]) i++,j++; else j=next[j]; } if(j==tlen) return i-tlen+1; //标号从0开始 else ; } // 第二步学习写好这个函数 int KMP_Count() { ; ; &&tlen==) ]==T[]; ;i<slen;i++) { &&S[i]!=T[j]) j=next[j]; if(S[i]==T[j]) j++; if(j==tlen) { ret++; j=next[j]; } } return ret; } // 第三步,本着满足前两个函数的需求这一目标,来学习写好这个函数 // 而这一步,正是KMP算法精华所在 void getNext() { int j,k; j=;k=-;next[]=-; while(j<tlen) ||T[j]==T[k]) next[++j]=++k; else k=next[k]; } void printNext() { ;i<tlen;i++) printf("%3c",T[i]); puts(""); ;i<tlen;i++) printf("%3d",next[i]); puts(""); } int main() { // while(cin>>T) // tlen=strlen(T),getNext(),printNext(); int tt;cin>>tt; while(tt--) { cin>>T>>S; slen=strlen(S); tlen=strlen(T); getNext(); printNext(); cout<<KMP_Count()<<endl; // for(int i=0;i<tlen;i++) // printf("%d",next[i]); // puts(""); // cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl; // cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl; } }