http://www.cnblogs.com/ziyi--caolu/archive/2012/12/13/2816279.html (参考)
附我的代码:
/****HDU2846 *构造 字典树 的方法 *字符串匹配 *STRING S=X1X2X3X4... *X1... +X2...+X3...+ + +... **ABABBBB ABABBB AND ABBBB IS REPEATED ! * CREATE A TAG*/#includeusing namespace std;const int maxn=500050;//600050 Memory Limit Exceeded //400050 Runtime Error (ACCESS_VIOLATION) array outstruct 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