此处为代码
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e6 + 10;
int tr[N][26],idx;
queue<int>q;
int fail[N];
int tag[N];
string s[N];
string str;
int ans[N];
void build(int x){
int p = 0;
for(int i=0;i < s[x].size();i++){
int t = s[x][i] - 'a';
if(!tr[p][t]) tr[p][t] = ++idx;
p = tr[p][t];
}
tag[p] = x;
}
void get_fail(){
for(int i=0;i<26;i++) if(tr[0][i]) q.push(tr[0][i]);
while(q.size()){
int t = q.front();
q.pop();
for(int i=0;i<26;i++){
if(tr[t][i]){
fail[tr[t][i]] = tr[fail[t]][i];
q.push(tr[t][i]);
}else tr[t][i] = tr[fail[t]][i];
}
}
}
void AC(){
int p = 0;
for(int i=0;i<str.size();i++){
if(str[i] != '{') p = tr[p][str[i] - 'a'];
else{
p = 0;
continue;
}
for(int j=p;j;j = fail[j]){
ans[tag[j]]++;
}
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> s[i];
str += s[i] + '{';
build(i);
}
cout << str << endl;
get_fail();
AC();
for(int i=1;i<=n;i++) cout << ans[i] << endl;
return 0;
}