牛客竞赛字符串训练 Youhane Assembler
时隔60天,再次写KMP模板题,手有点生疏了,感觉打印出来的模板不行啊,还是找了自己以前敲的代码补上去,欸,我还是太菜了。。。。。
对了,此生绝对不用memset了,要用就用fill,时间复杂度太慢了memset,令人失望!
#include <bits/stdc++.h>
const int maxn=3e5+7;
using namespace std;
int n,q,len[maxn],l,r;
int nxt[maxn];
string DNA[maxn];
void getnxt(int r){
fill(nxt,nxt+len[r],0);
for(int i=1;i<len[r];i++)
{
int k=nxt[i];
while(k && DNA[r][k]!=DNA[r][i])
k=nxt[k];
if(DNA[r][k]==DNA[r][i])
k++;
nxt[i+1]=k;
}
}
int getnum(int l,int r){
int k=0;
for(int i=0;i<len[l];i++){
while(k && DNA[r][k]!=DNA[l][i])
k=nxt[k];
if(DNA[l][i]==DNA[r][k])
k++;
}
return k;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>DNA[i];
len[i]=DNA[i].size();
}
scanf("%d",&q);
while(q--){
scanf("%d %d",&l,&r);
getnxt(r);
printf("%d\n",getnum(l,r));
}
return 0;
}