标签:blog io os ar for sp 2014 on log
next数组表示的是,最长前缀和后缀相等的长度。
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> using namespace std; const int N=1000000; int next[N]; char s[N],t[N]; /*********KMP小结**********/ //求next数组 void getNext(int lt) { int k=-1,i=0; next[0]=-1; while(i<lt) { if(k==-1||s[k]==t[i]) next[++i]=++k; else k=next[k]; } } //KMP求模板串第一次出现的位置 int getIndex(int ls,int lt) { getNext(lt); int i=0,k=0; while(i<ls&&k<lt) { if(k==-1||s[i]==t[k]) { i++; k++; } else k=next[k]; } if(k==lt) return i-lt+1; //返回的下标从0,开始算。 else return -1; } //KMP求模板串出现的次数 int getCnt(int ls,int lt) { getNext(lt); int k=0,cnt=0; for(int i=0;i<ls;i++) { while(k!=-1&&s[i]!=t[k]) k=next[k]; if(s[i]==t[k]) k++; if(k==lt){ cnt++; k=next[k]; } } return cnt; } int main() { cin>>s>>t; int ls=strlen(s); int lt=strlen(t); cout<<getIndex(ls,lt)<<endl; return 0; }
标签:blog io os ar for sp 2014 on log
原文地址:http://blog.csdn.net/code_or_code/article/details/40321265