kmp模板 && 扩展kmp模板
2016-08-04 22:35
477 查看
kmp模板:
#include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; typedef long long LL; typedef pair<int,int> PII; #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000+9 int nt[10000+1]; char a[K],b[10001]; //参数为模板串和next数组 //字符串均从下标0开始 void kmp_next(char *T,int *nt) { nt[0]=0; for(int i=1,j=0,m=strlen(T);i<m;i++) { while(j&&T[i]!=T[j])j=nt[j-1]; if(T[i]==T[j])j++; nt[i]=j; } } int kmp(char *S,char *T,int *nt) { kmp_next(T,nt); int ans=0,sn=strlen(S),tn=strlen(T); for(int i=0,j=0;i<sn;i++) { while(j&&S[i]!=T[j])j=nt[j-1]; if(S[i]==T[j])j++; if(j==tn) ans++; } return ans; } int main(void) { int t;cin>>t; while(t--) { scanf("%s%s",b,a); printf("%d\n",kmp(a,b,nt)); } return 0; }
扩展kmp模板:
#include<iostream> #include<string> #include<cstring> #include<cstdio> using namespace std; const int K=100005; int nt[K],extand[K]; char S[K],T[K]; void Getnext(char *T,int *next) { int len=strlen(T),a=0; next[0]=len; while(a<len-1 && T[a]==T[a+1]) a++; next[1]=a; a=1; for(int k=2; k<len; k++) { int p=a+next[a]-1,L=next[k-a]; if( (k-1)+L >= p) { int j = (p-k+1)>0 ? (p-k+1) : 0; while(k+j<len && T[k+j]==T[j]) j++; next[k]=j; a=k; } else next[k]=L; } } void GetExtand(char *S,char *T,int *next) { Getnext(T,next); int slen=strlen(S),tlen=strlen(T),a=0; int MinLen = slen < tlen ? slen : tlen; while(a<MinLen && S[a]==T[a]) a++; extand[0]=a; a=0; for(int k=1; k<slen; k++) { int p=a+extand[a]-1, L=next[k-a]; if( (k-1)+L >= p) { int j= (p-k+1) > 0 ? (p-k+1) : 0; while(k+j<slen && j<tlen && S[k+j]==T[j]) j++; extand[k]=j; a=k; } else extand[k]=L; } } int main(void) { while(scanf("%s%s",S,T)==2) { GetExtand(S,T,nt); for(int i=0; i<strlen(T); i++) printf("%d ",nt[i]); puts(""); for(int i=0; i<strlen(S); i++) printf("%d ",extand[i]); puts(""); } return 0; }
相关文章推荐
- HDOJ 4300 Clairewd's message(扩展KMP)
- 扩展KMP模板
- [POJ 3461] Oulipo & KMP模板
- KMP && AC自动机模板
- hdoj1841Find the Shortest Common Superstring【扩展KMP模板】
- hdu 1358 & 1711 kmp 模板
- 最小(大)表示法习题 -- 来自[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher
- 字符串匹配--扩展KMP模板
- [目前未找到题目]扩展KMP模板
- 大二训练第一周 C - Revolving Digits &&hdu 4333 扩展kmp
- 扩展KMP模板
- 扩展KMP模板
- 【哈希&KMP模板题】-POJ-3461-Oulipo
- 扩展kmp--模板解析
- hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String
- 【模板】kmp以及扩展kmp
- 欧几里德算法及其扩展(推导&&模板)
- 扩展KMP模板
- 扩展kmp 模板
- ACM常用模板——扩展KMP