原题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
char t[N];
char c[N];int clen = 1;
char s[N];
vector<int> G[N];
int num[N];int lp[N];
bool vis[N];
int n;
int ans;
void sp(int fa,int u){
int pos = lp[fa];
for(unsigned int i = 0;i < G[pos].size();i++){
if(c[u] == c[G[pos][i]]&&u != G[pos][i]){
lp[u] = G[pos][i];
}
}
for(unsigned int i = 0;i < G[u].size();i++){
int v = G[u][i];
sp(u,v);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1;i <= n;i++){
cin >> t;
int k = strlen(t);
int pos = 0;
for(int j = 0;j < k;j++){
c[clen+j] = t[j];
bool change = false;
for(unsigned int o = 0;o < G[pos].size();o++){
if(c[G[pos][o]] == t[j]){
pos = G[pos][o];
change = true;
break;
}
}
if(!change){
G[pos].push_back(clen+j);
pos = clen+j;
}
}
num[pos]++;
clen += k;
}
for(unsigned int i = 0;i < G[0].size();i++){
sp(0,G[0][i]);
}
cin >> s;
int k = strlen(s);
int i = 0;
int pos = 0;
while(i < k){
bool b = true;
for(unsigned int j = 0;j < G[pos].size();j++){
int v = G[pos][j];
if(c[v] == s[i]){
b = false;
pos = v;
break;
}
}
if(b&&pos == 0){
i++;
}
else if(!b){
i++;
if(!vis[pos]){
vis[pos] = true;
ans += num[pos];
}
}
else{
pos = lp[pos];
}
}
cout << ans;
return 0;
}