博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2896 简单题
阅读量:5243 次
发布时间:2019-06-14

本文共 2914 字,大约阅读时间需要 9 分钟。

题目意思   就是说给你N个病毒,M 个模式串,分别找出这M个模式串里面有哪些病毒,把标号给输出来;  方法      首先  因为要用到多次,所以用一个 标记  看这是第几次进去,接下来就是模板题了;  1 #include
2 #include
3 #include
4 #include
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/archive/2013/04/12/3016511.html

你可能感兴趣的文章
name phone email正则表达式
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
python-三级菜单和购物车程序
查看>>
条件断点 符号断点
查看>>
VMware12 + Ubuntu16.04 虚拟磁盘扩容
查看>>
水平垂直居中
查看>>