HDU 2896 简单题

 题目意思   就是说给你N个病毒,M 个模式串,分别找出这M个模式串里面有哪些病毒,把标号给输出来;
方法 首先 因为要用到多次,所以用一个 标记 看这是第几次进去,接下来就是模板题了;

1
#include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 struct date 8 { 9 int num,tab; 10 date *next[130],*fail; 11 date( ) 12 { 13 memset( next,NULL,sizeof(next)); 14 fail = NULL; 15 num = tab = 0; 16 } 17 }*que[112345],*root; 18 19 int tail,head,ptr,k,res[555]; 20 char str[11234]; 21 22 void inint( ) 23 { 24 tail = head = ptr = 0; 25 root = new date; 26 } 27 28 void insert( char *word,int tab ) 29 { 30 date *temp = root; 31 while( *word ) 32 { 33 int num = *word; 34 if( temp->next[num] == NULL ) 35 temp->next[num] = new date; 36 temp = temp->next[num]; 37 word++; 38 } 39 temp->num = 0; 40 temp->tab = tab; 41 } 42 43 void build_AC( ) 44 { 45 que[tail++] = root; 46 while( tail > head ) 47 { 48 date *temp = que[head++]; 49 for( int i = 0; i < 130; i++ ) 50 if( temp->next[i] != NULL ) 51 { 52 if( temp == root ) temp->next[i]->fail = root; 53 else temp->next[i]->fail = temp->fail->next[i]; 54 que[tail++] = temp->next[i]; 55 } 56 else 57 { 58 if( temp == root ) temp->next[i] = root; 59 else temp->next[i] = temp->fail->next[i]; 60 } 61 } 62 } 63 64 int query( char *word,int i ) 65 { 66 date *patten,*temp = root; 67 while( *word ) 68 { 69 int num = *word; 70 temp = temp->next[num]; 71 patten = temp; 72 while( patten != root ) 73 { 74 if( patten->num != i ) 75 { 76 patten->num = i; 77 if( patten->tab ) 78 res[k++] = patten->tab; 79 } 80 else break; 81 patten = patten->fail; 82 } 83 word++; 84 } 85 return 0; 86 } 87 88 int main( ) 89 { 90 int N,M,i,j,ans; 91 while( scanf("%d",&N) != EOF ) 92 { 93 inint(); 94 for( i = 1; i <= N; i++ ) 95 { 96 scanf("%s",&str); 97 insert(str,i); 98 } 99 build_AC( ); 100 scanf("%d",&M); 101 ans = 0; 102 for( i = 1; i <= M; i++ ) 103 { 104 scanf("%s",&str); 105 k = 0; query( str,i ); 106 if( k ) ans++,printf("web %d:",i); 107 if( k ) sort( res,res+k ); 108 for( j = 0; j < k; j++ ) 109 printf(" %d",res[j]); 110 if( k ) printf("\n"); 111 } 112 printf("total: %d\n",ans); 113 } 114 return 0; 115 }
原文地址:https://www.cnblogs.com/wulangzhou/p/3016511.html