HDU2896+AC自动机

ac自动机 模板题

  1 /*
  2 
  3 */
  4 #include<stdio.h>
  5 #include<string.h>
  6 #include<stdlib.h>
  7 #include<algorithm>
  8 #include<iostream>
  9 #include<queue>
 10 #include<map>
 11 #include<stack>
 12 #include<set>
 13 #include<math.h>
 14 using namespace std;
 15 typedef long long int64;
 16 //typedef __int64 int64;
 17 typedef pair<int64,int64> PII;
 18 #define MP(a,b) make_pair((a),(b)) 
 19 const int maxn = 100;
 20 const int maxm = 10005;
 21 const int inf = 0x7fffffff;
 22 const double pi=acos(-1.0);
 23 const double eps = 1e-8;
 24 
 25 struct Tree{
 26     int id;
 27     Tree *fail;
 28     Tree *next[ maxn ];
 29 };
 30 Tree root;
 31 Tree *q[ 20000005 ];
 32 char str[ maxm ];
 33 int tot;
 34 int cnt[ 555 ];
 35 int Index_cnt ;
 36 bool vis[ 555 ];
 37 
 38 void init(){
 39     root.id = 0;
 40     root.fail = NULL;
 41     for( int i=0;i<maxn;i++ )
 42         root.next[ i ] = NULL;
 43 }
 44 
 45 void build( char str[],int ID ){
 46     int len = strlen( str );
 47     Tree *p = &root;
 48     Tree *tmp = NULL;
 49     for( int i=0;i<len;i++ ){
 50         int id = str[i]-32;
 51         if( p->next[ id ]==NULL ){
 52             tmp = (Tree *)malloc(sizeof( root ));
 53             tmp->id = 0;
 54             for( int j=0;j<maxn;j++ )
 55                 tmp->next[ j ] = NULL;
 56             p->next[ id ] = tmp;
 57             p = p->next[ id ];
 58         }
 59         else 
 60             p = p->next[ id ];
 61     }
 62     p->id = ID;
 63     return ;
 64 }
 65 
 66 void build_AC(){
 67     int head = 0,tail = 0;
 68     Tree *p = &root;
 69     Tree *tmp = NULL;
 70     q[ tail++ ] = p;
 71     while( head!=tail ){
 72         p = q[ head++ ];
 73         for( int i=0;i<maxn;i++ ){
 74             if( p->next[i]!=NULL ){
 75                 if( p==(&root) ){
 76                     p->next[i]->fail = &root;
 77                 }
 78                 else{
 79                     tmp = p->fail;
 80                     while( tmp!=NULL ){
 81                         if( tmp->next[i]!=NULL ){
 82                             p->next[i]->fail = tmp->next[i];
 83                             break;
 84                         }
 85                         tmp = tmp->fail;
 86                     }
 87                     if( tmp==NULL )
 88                         p->next[i]->fail = &root;
 89                 }
 90                 q[ tail++ ] = p->next[i];
 91             }
 92         }
 93     }
 94 }
 95 
 96 void query( char str[] ){
 97     int len = strlen( str );
 98     Tree *p = &root;
 99     Tree *tmp = NULL;
100     for( int i=0;i<len;i++ ){
101         int id = str[i]-32;
102         while( p->next[id]==NULL&&p!=(&root) ){
103             p = p->fail;
104         }
105         p = p->next[ id ];
106         if( p==NULL )
107             p = &root;
108         tmp = p;
109         while( tmp!=(&root) ){
110             if( tmp->id!=0&&vis[tmp->id]==false ){
111                 vis[tmp->id] = true;
112                 cnt[ Index_cnt++ ] = tmp->id;
113             }
114             tmp = tmp->fail;
115         }
116     }
117     return ;
118 }
119 
120 int main(){
121     int n,m;
122     while( scanf("%d",&n)!=EOF ){
123         init();
124         char s[ 255 ];
125         for( int i=1;i<=n;i++ ){
126             scanf("%s",s);
127             build( s,i );
128         }
129         build_AC();
130         scanf("%d",&m);
131         tot = 0;
132         for( int i=1;i<=m;i++ ){
133             scanf("%s",str);
134             Index_cnt = 0;
135             memset( vis,false,sizeof( vis ) );
136             query( str );
137             if( Index_cnt!=0 ) {
138                 tot++;sort( cnt,cnt+Index_cnt );
139                 printf("web %d:",i);
140                 for( int j=0;j<Index_cnt;j++ )
141                     printf(" %d",cnt[j]);
142                 printf("\n");
143             }
144         }
145         printf("total: %d\n",tot);
146     }
147     return 0;
148 }
View Code

 

posted @ 2013-08-25 22:46  xxx0624  阅读(312)  评论(0编辑  收藏  举报