http://www.cnblogs.com/ziyi--caolu/archive/2012/12/13/2816279.html (参考)
附我的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/****HDU2846 *构造 字典树 的方法 *字符串匹配 *STRING S=X1X2X3X4... *X1... +X2...+X3...+ + +... **ABABBBB ABABBB AND ABBBB IS REPEATED ! * CREATE A TAG */ #include <bits/stdc++.h> using namespace std; const int maxn=500050;//600050 Memory Limit Exceeded //400050 Runtime Error (ACCESS_VIOLATION) array out struct node { int nxt[26]; int num; int tag; }tre[maxn]; int p,q,cnt,len; char s[50]; void add(int now,int x) { if(len==x) return; int v=s[x]-'a'; if(!tre[now].nxt[v]) tre[now].nxt[v]=++cnt; if(tre[tre[now].nxt[v]].tag!=p+1) { tre[tre[now].nxt[v]].num++; tre[tre[now].nxt[v]].tag=p+1; } add(tre[now].nxt[v],x+1); } int fin(int now,int x) { if(len==x) return tre[now].num; int v=s[x]-'a'; if(!tre[now].nxt[v])return 0; fin(tre[now].nxt[v],x+1); } int main() { scanf("%d",&p); memset(tre,0,sizeof(tre)); cnt=0; while(p--) { scanf("%s",s); len=strlen(s); for(int i=0;i<len;i++) add(0,i); } scanf("%d",&q); while(q--) { scanf("%s",s); len=strlen(s); printf("%d ",fin(0,0)); } return 0; }