POJ 3461 kmp 应用
2014-04-19 11:07
183 查看
题意:求匹配串在文本中出现次数,KMP应用,理解了就OK了,每次匹配成功就累加次数,开始的时候超时,
由于在处理每次成功的时候让i=i-len2+1,相当于回溯了,后来一想,本次成功,相当于“失败”,i不动,
j需要用哪里来匹配?当然是next{j}!嘛(此处j=len2)。第一次真正敲kmp,完全根据自己理解敲出来的总控。
由于在处理每次成功的时候让i=i-len2+1,相当于回溯了,后来一想,本次成功,相当于“失败”,i不动,
j需要用哪里来匹配?当然是next{j}!嘛(此处j=len2)。第一次真正敲kmp,完全根据自己理解敲出来的总控。
#include<iostream> //用string 220ms,char *,scanf 110ms #include<string> #include<cstdio> #include<cstring> using namespace std; int next[40000]; void get_next(char * s) //next[len]也求得了(有意义)。 { int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(j==-1||s[i]==s[j]) { i++;j++; if(s[i]==s[j]) //此处只为文本的匹配,可以加快! next[i]=next[j]; else next[i]=j; } else { j=next[j]; } } } int count=0; void kmp(char * tx,char * w) { int i=-1,j=-1; //为了下面++ int len2=strlen(w); int len1=strlen(tx); while(i<len1) { if(j==-1||tx[i]==w[j]) { i++;j++; } else { j=next[j]; } if(j==len2) //一次匹配成功, { count++; j=next[j]; //j对应位置。 } } } char tx[1000008];char w[10010]; int main() { int ta; cin>>ta; while(ta--) { count=0; scanf("%s\n",w); scanf("%s",tx); get_next(w); kmp(tx,w); printf("%d\n",count); } return 0; }
相关文章推荐
- POJ 3461 Oulipo KMP大法应用
- POJ 3461 kmp 应用
- poj 3461 Oulipo(KMP)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- Kmp 加深理解 之 poj 3461
- Poj 3461 Oulipo(Kmp)
- poj 3461 KMP
- POJ 3461 Oulipo---kmp
- poj 3461 Oulipo kmp
- POJ 3461 kmp计算子串(可重叠)的个数
- POJ 3461 Oulipo (kmp入门)
- poj 3461 KMP(模式匹配模板)
- poj 3461 Oulipo (KMP 模板题)
- Oulipo_poj_3461_KMP水题
- poj 3461 Oulipo(KMP模板题)
- POJ_1961 KMP next的典型应用 类似于 poj2406
- KMP 专场 POJ 3461
- POJ 3461 Oulipo KMP练习
- POJ - 3461 Oulipo (kmp裸题)
- POJ-2752-Seek the Name, Seek the Fame(KMPnext数组应用)