您的位置:首页 > 其它

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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: