题目链接:http://vjudge.net/problem/36265
#include #define N 200using namespace std;const int maxnode=11000;const int sigma_size=26;int res[N];struct AC_Automata{ int ch[maxnode][sigma_size]; int val[maxnode]; /// 每个字符串的结尾结点都有一个非0的val int f[maxnode]; /// fail函数 int last[maxnode]; /// last[i]=j表j节点表示的单词是i节点单词的后缀,且j节点是单词节点 int sz; ///初始化0号根节点的相关信息 void init() { sz=1; memset(ch[0],0,sizeof(ch[0])); memset(res,0,sizeof res); val[0]=0; } ///Insert负责构造ch与val数组 ///插入字符串,v必须非0表示一个单词节点 void Insert(char *s,int v) { int n=strlen(s),u=0; for(int i=0; i
q; last[0]=f[0]=0; for(int i=0; i
0 void print(int i) { if(val[i]) { res[val[i]]++; print(last[i]); } }};AC_Automata ac;char word[N][N/2];char op[1000005];int main(){ //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF&&n) { ac.init(); for(int i=1;i<=n;i++) { scanf("%s",&word[i]); ac.Insert(word[i],i); } ac.getFail(); scanf("%s",op); ac.Find(op); int maxn=-1; for(int i=1;i<=n;i++) if(res[i]>maxn) maxn=res[i]; printf("%d\n",maxn); int c=0; for(int i=1;i<=n;i++) { if(res[i]==maxn) { if(c) puts(""); c++; printf("%s",word[i]); } } printf("\n"); } return 0;}