luogu P3808/3796
首先
Trie树:
#include<bits/stdc++.h>
using namespace std;
int T,q,n,t[3000005][65],cnt[3000005],idx;
char s[3000005];
int getnum(char x){
if(x>='A'&&x<='Z')
return x-'A';
else if(x>='a'&&x<='z')
return x-'a'+26;
else
return x-'0'+52;
}
void insert(char str[]){
int p=0,len=strlen(str);
for(int i=0;i<len;i++){
int c=getnum(str[i]);
if(!t[p][c])
t[p][c]=++idx;
p=t[p][c];
cnt[p]++;
}
}
int find(char str[]){
int p=0,len=strlen(str);
for(int i=0;i<len;i++){
int c=getnum(str[i]);
if(!t[p][c])
return 0;
p=t[p][c];
}
return cnt[p];
}
int main(){
scanf("%d",&T);
while(T--){
for(int i=0;i<=idx;i++)
for(int j=0;j<=122;j++)
t[i][j]=0;
for(int i=0;i<=idx;i++)
cnt[i]=0;
idx=0;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%s",s);
insert(s);
}
for(int i=1;i<=q;i++){
scanf("%s",s);
printf("%d\n",find(s));
}
}
return 0;
}
烤馍片kmp:
#include<bits/stdc++.h>
using namespace std;
int kmp[1000010];
int la,lb,j;
char a[1000010],b[1000010];
int main() {
cin>>a+1;
cin>>b+1;
la=strlen(a+1);
lb=strlen(b+1);
for (int i=2; i<=lb; i++) {
while(j&&b[i]!=b[j+1])j=kmp[j];
if(b[j+1]==b[i])j++;
kmp[i]=j;
}
j=0;
for(int i=1; i<=la; i++) {
while(j>0&&b[j+1]!=a[i])j=kmp[j];
if (b[j+1]==a[i])j++;
if (j==lb) {
cout<<i-lb+1<<endl;
j=kmp[j];
}
}
for (int i=1; i<=lb; i++)cout<<kmp[i]<<" ";
return 0;
}
易得:
#include<bits/stdc++.h>
using namespace std;
char s[2000005],T[2000005];
int n,cnt,vis[200051],ans,in[2000005],Map[2000005];
struct jntm{
int son[26],fail,flag,ans;
void clear(){memset(son,0,sizeof(son)),fail=flag=ans=0;}
}trie[2000005];
queue<int>q;
void insert(char* s,int num){
int u=1,len=strlen(s);
for(int i=0;i<len;i++){
int v=s[i]-'a';
if(!trie[u].son[v])trie[u].son[v]=++cnt;
u=trie[u].son[v];
}
if(!trie[u].flag)trie[u].flag=num;
Map[num]=trie[u].flag;
}
void getFail(){
for(int i=0;i<26;i++)trie[0].son[i]=1;
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
int Fail=trie[u].fail;
for(int i=0;i<26;i++){
int v=trie[u].son[i];
if(!v){trie[u].son[i]=trie[Fail].son[i];continue;}
trie[v].fail=trie[Fail].son[i]; in[trie[v].fail]++;
q.push(v);
}
}
}
void topu(){
for(int i=1;i<=cnt;i++)
if(in[i]==0)q.push(i);
while(!q.empty()){
int u=q.front();q.pop();vis[trie[u].flag]=trie[u].ans;
int v=trie[u].fail;in[v]--;
trie[v].ans+=trie[u].ans;
if(in[v]==0)q.push(v);
}
}
void query(char* s){
int u=1,len=strlen(s);
for(int i=0;i<len;i++)
u=trie[u].son[s[i]-'a'],trie[u].ans++;
}
int main(){
scanf("%d",&n); cnt=1;
for(int i=1;i<=n;i++){
scanf("%s",s);
insert(s,i);
}getFail();scanf("%s",T);
query(T);topu();
for(int i=1;i<=n;i++)printf("%d\n",vis[Map[i]]);
}