#include<bits/stdc++.h>usingnamespace std;constint maxn =1e6+5;int ch[maxn][30], fa[maxn], End[maxn];int cnt =0, n;intget_num(char c){return c -'a';}voidbuild(string s){int cur =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);if(!ch[cur][c]) ch[cur][c]=++cnt;
cur = ch[cur][c];}
End[cur]++;}voidget_fail(){
queue<int> q;for(int i =0; i <26; i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int u = q.front(); q.pop();for(int i =0; i <26; i++){int&v = ch[u][i];if(v){
fa[v]=ch[fa[u]][i];
q.push(v);}else v = ch[fa[u]][i];}}}intquery(string s){int cur =0, ans =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);
cur = ch[cur][c];for(int j = cur; j && End[j]!=-1; j = fa[j]){
ans += End[j]; End[j]=-1;}}return ans;}intmain(){
string s;
cin >> n;for(int i =0; i < n; i++){cin >> s;build(s);}get_fail(); cin >> s;
cout <<query(s)<< endl;return0;}
洛谷P3796
#include<bits/stdc++.h>usingnamespace std;constint maxn =1e6+5;int ch[maxn][30], fa[maxn], End[maxn], ans[158], Maxs;int cnt =0, n;
string str[158];intget_num(char c){return c -'a';}voidbuild(string s,int x){int cur =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);if(!ch[cur][c]) ch[cur][c]=++cnt;
cur = ch[cur][c];}
End[cur]= x;}voidget_fail(){
queue<int> q;for(int i =0; i <26; i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int u = q.front(); q.pop();for(int i =0; i <26; i++){int&v = ch[u][i];if(v){
fa[v]=ch[fa[u]][i];
q.push(v);}else v = ch[fa[u]][i];}}}voidquery(string s){int cur =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);
cur = ch[cur][c];for(int j = cur; j; j = fa[j])if(End[j]){
ans[End[j]]++;
Maxs =max(Maxs, ans[End[j]]);}}}intmain(){
string s;while(cin >> n && n){for(int i =0; i <= cnt; i++){for(int j =0; j <26; j++)ch[i][j]=0;
fa[i]=0;
End[i]=0;}memset(ans,0,sizeof(ans));
Maxs =0;
cnt =0;for(int i =1; i <= n; i++){
cin >> str[i];build(str[i], i);}get_fail(); cin >> s;query(s);
cout << Maxs << endl;for(int i =1; i <= n; i++)if(ans[i]== Maxs)cout << str[i]<< endl;}return0;}
luogu p5357
#include<bits/stdc++.h>usingnamespace std;constint maxn =2e6+6, maxm =2e5+6;int ch[maxn][30], fa[maxn], End[maxn], ans[maxm], Map[maxn], In[maxn];int cnt =0, n;int pos[maxn];intget_num(char c){return c -'a';}voidbuild(string s,int x){int cur =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);if(!ch[cur][c]) ch[cur][c]=++cnt;
cur = ch[cur][c];}// if(!End[cur])End[cur] = x;// Map[x] = End[cur];
pos[x]= cur;//new}voidget_fail(){
queue<int> q;for(int i =0; i <26; i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int u = q.front(); q.pop();for(int i =0; i <26; i++){int&v = ch[u][i];if(v){
fa[v]=ch[fa[u]][i];
In[ch[fa[u]][i]]++;//新加
q.push(v);}else v = ch[fa[u]][i];}}}voidquery(string s){int cur =0, len = s.length();for(int i =0; i < len; i++){int c =get_num(s[i]);
cur = ch[cur][c];// for(int j = cur; j; j = fa[j])// if(End[j])ans[End[j]]++;
ans[cur]++;//替换 }}voidtopu(){
queue<int> q;for(int i=1;i<=cnt;i++)if(In[i]==0)q.push(i);while(!q.empty()){int u=q.front(); q.pop();int v=fa[u]; In[v]--;
ans[v]+= ans[u];if(In[v]==0)q.push(v);}}intmain(){
string s;
cin >> n;for(int i =1; i <= n; i++){
cin >> s;build(s, i);}get_fail(); cin >> s;query(s);topu();for(int i =1; i <= n; i++)
cout << ans[pos[i]]<< endl;return0;}