hdu 3065 病毒侵袭持续中

来源:互联网 发布:python微信抢红包 编辑:程序博客网 时间:2024/05/02 02:14

点击打开链接hdu 3065


思路:AC自动机模板
分析:
1 题目要求找出相应的字符串在源码串中出现的次数,并且告诉我们字符串只有大写字母。其实解法是一样的,只是别被大写字母这个给限制了,还是相当于建立trie,但是不能单建立大写字母的trie树。
2 当匹配到一个单词的时候就把单词对应的编号对应的个数加加。

代码

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<queue>using namespace std;#define MAXN 2000010#define MAX 1010#define N 100int n , cnt;int vis[MAX];char words[MAX][N*2];char text[MAXN];struct Node{   Node *next;   Node *child[N];   int number;};Node node[MAXN];Node *root;queue<Node*>q;Node* newNode(){   node[cnt].next = NULL;   node[cnt].number = 0;   for(int i = 0 ; i < N ; i++)      node[cnt].child[i] = NULL;   return &node[cnt++];}void insert(char *str , int x){   int len = strlen(str);   Node *p = root;   for(int i = 0 ; i < len ; i++){      int num = str[i]-32;/*不能只建立大写字母的trie树*/      if(p->child[num] == NULL)        p->child[num] = newNode();      p = p->child[num];   }   p->number = x;}void getNext(){    while(!q.empty())        q.pop();        q.push(root);    root->next = NULL;       while(!q.empty()){       Node *p = q.front();       q.pop();       for(int i = 0 ; i < N ; i++){          if(p->child[i]){             q.push(p->child[i]);             Node *tmp = p->next;             while(tmp){               if(tmp->child[i]){                 p->child[i]->next = tmp->child[i];                 break;               }               tmp = tmp->next;             }             if(tmp == NULL)                p->child[i]->next = root;          }       }        }}void find(){   int len = strlen(text);   Node *p = root;   for(int i = 0 ; i < len ; i++){      int num = text[i]-32;      while(p->child[num] == NULL && p != root)          p = p->next;      if(p->child[num]){        p = p->child[num];        Node *tmp = p;        while(tmp){           if(tmp->number)              vis[tmp->number]++;/*编号加加*/           tmp = tmp->next;        }      }   }}/*输出*/void output(){   for(int i = 1 ; i <= n ; i++){      if(vis[i])        printf("%s: %d\n" , words[i] , vis[i]);   }}int main(){   while(scanf("%d" , &n) != EOF){       cnt = 0;       root = newNode();       memset(vis , 0 , sizeof(vis));       for(int i = 1 ; i <= n ; i++){          scanf("%s" , words[i]);          insert(words[i] , i);       }       getchar();       gets(text);       getNext();       find();       output();   }   return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五年级英语太差怎么办 听课效率没有自学效率高怎么办 小学生不好好写作业怎么办 带的家教成绩没有提高怎么办 学生出国学校成绩证明怎么办 学生成绩考差了班主任怎么办 高一的学生成绩跟不上怎么办 综合素质评价手册丢了怎么办 小学综合素质评价手册丢了怎么办 人体质不出汗差怎么办 儿子一年级语文成绩太差怎么办 小孩读一年级差几个月怎么办 小孩一年级下学期数学差怎么办 小学五年成绩差怎么办 生完孩子记忆力不好怎么办 生了孩子之后记忆力不好怎么办 孩子记忆力差学习不好怎么办 党课结业证丢了怎么办 对三年级不听话的学生应该怎么办 素质报告单丢了怎么办 社保小红本丢了怎么办 小红本丢了怎么办 孩子小红本丢了怎么办 小学素质报告册丢了怎么办 小学生素质报告册丢了怎么办 高中素质报告册丢了怎么办 小升初素质报告单丢了怎么办? 三供一业移交后社区管理职能怎么办 初中政治总考不好怎么办 孩子上初一学习越来越差怎么办 胸经过整容后变得胸闷怎么办? 网瘾高中不学习怎么办 犯罪人逃到美国怎么办 10岁儿童偏胖怎么办 土地面积与实际面积不符怎么办 军转进省直单位双选失败怎么办 房改房楼龄到了70年怎么办 商品房房改房到70年后怎么办 公务员未享受房改政策怎么办 两套房改房违规怎么办 法院保全的物品在我家怎么办