标签:
输入n个模板串,再输入一个文本串,找到在文本串中出现的模板串,输出这些模板串的序号
1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 const int maxm=1024; 7 //节点数目,模板串数目,文本串长度最多都是1024 8 struct AC{ 9 char ch[maxm][26]; 10 int book[maxm]; 11 int f[maxm]; 12 int val[maxm]; 13 int last[maxm]; 14 int ans,size,count; 15 int idx(char c) 16 { 17 return c-‘a‘; 18 } 19 void mark(int j) 20 { 21 if(j){ 22 if(!book[val[j]]){ 23 ans++; 24 book[val[j]]=1; 25 printf("find:val[j]=%d\n",val[j]); 26 } 27 mark(last[j]); 28 } 29 } 30 void getF() 31 { 32 queue<int> Q; 33 f[0]=0; 34 for(int i=0;i<26;i++){ 35 int u=ch[0][i]; 36 if(u){ 37 Q.push(u); 38 last[u]=f[u]=0; 39 } 40 } 41 while(!Q.empty()){ 42 int r=Q.front();Q.pop(); 43 for(int c=0;c<26;c++){ 44 int u=ch[r][c]; 45 if(!u) continue; 46 Q.push(u); 47 int v=f[r]; 48 while(v&&!ch[v][c]) v=f[v]; 49 f[u]=ch[v][c]; 50 last[u]=val[f[u]]?f[u]:last[f[u]]; 51 52 } 53 } 54 } 55 void init() 56 { 57 ans=count=size=0; 58 memset(val,0,sizeof(val)); 59 memset(book,0,sizeof(book)); 60 memset(ch[0],0,sizeof(ch[0])); 61 } 62 void insert(char *p) 63 { 64 int u=0; 65 int n=strlen(p); 66 for(int i=0;i<n;i++){ 67 int c=idx(p[i]); 68 if(!ch[u][c]){ 69 ch[u][c]=++size; 70 memset(ch[size],0,sizeof(ch[size])); 71 }u=ch[u][c]; 72 } 73 val[u]=++count; 74 } 75 void find(char *p) 76 { 77 int n=strlen(p),j=0; 78 for(int i=0;i<n;i++) 79 { 80 int c=idx(p[i]); 81 while(j&&!ch[j][c]) j=f[j]; 82 j=ch[j][c]; 83 if(val[j]){ 84 if(!book[val[j]]){ 85 ans++; 86 book[val[j]]=1; 87 printf("find:val[j]=%d\n",val[j]); 88 } 89 mark(last[j]); 90 }else if(last[j]) mark(last[j]); 91 } 92 } 93 }; 94 AC solver; 95 int main() 96 { 97 solver.init(); 98 int n; 99 char s[maxm]; 100 scanf("%d",&n); 101 while(n--){ 102 scanf("%s",s); 103 solver.insert(s); 104 } 105 solver.getF(); 106 scanf("%s",s); 107 solver.find(s); 108 printf("%d",solver.ans); 109 return 0; 110 }
标签:
原文地址:http://www.cnblogs.com/gzhonghui/p/5803314.html