• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Free_rein
博客园    首页    新随笔    联系   管理    订阅  订阅

HDU-2222(Keywords Search)

还是AC自动机入门题...不解释了,可以看看其它两篇AC自动机的解题报告。

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2222

View Code
  1 //====================================================================
  2 //Name       :HDU 2222-Keywords Search
  3 //Author     :hxf
  4 //copyright  :http://www.cnblogs.com/Free-rein/
  5 //Description:
  6 //Data       :2012.7.20
  7 //========================================================================
  8 #include<iostream>
  9 #include<cmath>
 10 #include<algorithm>
 11 #include<stdio.h>
 12 #include<string.h>
 13 using namespace std;
 14 #define MAXN 10002
 15 const int len=26;//最多只有26个英文字母
 16 struct Tril{
 17     Tril *fail;
 18     Tril *son[len];
 19     int count;
 20     Tril(){
 21         fail=NULL;
 22         count=0;
 23         memset(son,NULL,sizeof(son));
 24     }
 25 }*tril[500001];
 26 char word[50];
 27 char str[1000001];
 28 void creat(char *word,Tril *root)
 29 {
 30     Tril *p=root;
 31     int lenth=strlen(word);
 32     for(int i=0;i<lenth;i++)
 33     {
 34         int index=word[i]-'a';
 35         if(p->son[index]==NULL)
 36             p->son[index]=new Tril();
 37         p=p->son[index];
 38     }
 39     p->count++;
 40 }
 41 void creat_ac_automation(Tril *root)
 42 {
 43     int first=0;
 44     int last=0;
 45     root->fail=NULL;
 46     tril[last++]=root;
 47     while(first<last)
 48     {
 49         Tril *p=tril[first++];
 50         Tril *k=NULL;
 51         for(int i=0;i<len;i++)
 52         {
 53             if(p->son[i]!=NULL)
 54             {
 55                 if(p==root)
 56                     p->son[i]->fail=root;
 57                 else
 58                 {
 59                     k=p->fail;
 60                     while(k!=NULL)
 61                     {
 62                         if(k->son[i]!=NULL)
 63                         {
 64                             p->son[i]->fail=k->son[i];
 65                             break;
 66                         }
 67                         k=k->fail;
 68                     }
 69                     if(k==NULL)
 70                     {
 71                         p->son[i]->fail=root;
 72                     }
 73                 }
 74                 tril[last++]=p->son[i];
 75             }
 76         }
 77     }
 78 }
 79 int query(Tril *root)
 80 {
 81     int lenth=strlen(str);
 82     int sum=0;
 83     Tril *p=root;
 84     for(int i=0;i<lenth;i++)
 85     {
 86         int index=str[i]-'a';
 87         while(p->son[index]==NULL&&p!=root)
 88         {
 89             p=p->fail;
 90         }
 91         p=p->son[index];
 92         if(p==NULL)
 93             p=root;
 94         Tril *k=p;
 95         while(k!=root&&k->count!=-1)
 96         {
 97             sum=sum+k->count;
 98             k->count=-1;
 99             k=k->fail;
100         }
101     }
102     return sum;
103 }
104 int main()
105 {
106     int t;
107     scanf("%d", &t);
108     while(t>0)
109     {
110         t--;
111         Tril *root=new Tril();
112         int n;
113         scanf("%d", &n);
114         for(int i = 0;i < n;i++)
115         {
116             scanf("%s", word);
117             getchar();
118             creat(word,root);
119         }
120         creat_ac_automation(root);
121         scanf("%s",str);
122         getchar();
123         printf("%d\n",query(root));
124     }
125     return 0;
126 }

 

 

posted @ 2012-08-09 14:14  Free_rein  阅读(257)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3