最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案。事实上方便起见这个最长串一起丢进去也无妨,而且更好写(时间也没有慢特别多)。

  另外需要注意的一点是init()里头的memset只需要清空之前用过的节点而不是所有节点,这是经常被卡的一点。

  代码如下:

  1 #include <stdio.h>
  2 #include <algorithm>
  3 #include <string.h>
  4 #include <queue>
  5 #include <vector>
  6 using namespace std;
  7 const int MAX_N = 100000 + 50;
  8 const int MAX_Tot = 100000 + 50;
  9
 10 struct Aho
 11 {
 12     struct state
 13     {
 14         int nxt[26];
 15         int fail,cnt;
 16     }stateTable[MAX_Tot];
 17
 18     int size;
 19
 20     queue<int> que;
 21
 22     void init()
 23     {
 24         while(que.size()) que.pop();
 25         for(int i=0;i<size;i++)
 26         {
 27             memset(stateTable[i].nxt,0,sizeof(stateTable[i].nxt));
 28             stateTable[i].fail = stateTable[i].cnt = 0;
 29         }
 30         size = 1;
 31     }
 32
 33     void insert(char *s)
 34     {
 35         int n = strlen(s);
 36         int now = 0;
 37         for(int i=0;i<n;i++)
 38         {
 39             char c = s[i];
 40             if(!stateTable[now].nxt[c-'a'])
 41                 stateTable[now].nxt[c-'a'] = size++;
 42             now = stateTable[now].nxt[c-'a'];
 43         }
 44         stateTable[now].cnt++;
 45     }
 46
 47     void build()
 48     {
 49         stateTable[0].fail = -1;
 50         que.push(0);
 51
 52         while(que.size())
 53         {
 54             int u = que.front();que.pop();
 55             for(int i=0;i<26;i++)
 56             {
 57                 if(stateTable[u].nxt[i])
 58                 {
 59                     if(u == 0) stateTable[stateTable[u].nxt[i]].fail = 0;
 60                     else
 61                     {
 62                         int v = stateTable[u].fail;
 63                         while(v != -1)
 64                         {
 65                             if(stateTable[v].nxt[i])
 66                             {
 67                                 stateTable[stateTable[u].nxt[i]].fail = stateTable[v].nxt[i];
 68                                 break;
 69                             }
 70                             v = stateTable[v].fail;
 71                         }
 72                         if(v == -1) stateTable[stateTable[u].nxt[i]].fail = 0;
 73                     }
 74                     que.push(stateTable[u].nxt[i]);
 75                 }
 76             }
 77         }
 78     }
 79
 80     //bool mark[MAX_Tot];
 81     void Get(int u)
 82     {
 83         while(u)
 84         {
 85             if(stateTable[u].cnt == -1) break;
 86             stateTable[u].cnt = -1;
 87             u = stateTable[u].fail;
 88         }
 89     }
 90
 91     int match(char *s)
 92     {
 93         //memset(mark, 0, sizeof mark);
 94         int n = strlen(s);
 95         int res = 0, now = 0;
 96         for(int i=0;i<n;i++)
 97         {
 98             char c = s[i];
 99             if(stateTable[now].nxt[c-'a']) now = stateTable[now].nxt[c-'a'];
100             else
101             {
102                 int p = stateTable[now].fail;
103                 while(p != -1 && stateTable[p].nxt[c-'a'] == 0) p = stateTable[p].fail;
104                 if(p == -1) now = 0;
105                 else now = stateTable[p].nxt[c-'a'];
106             }
107
108             Get(now);
109         }
110         for(int i=1;i<size;i++) if(stateTable[i].cnt > 0) return 0;
111         return 1;
112     }
113 }aho;
114
115 int T,n;
116 char s[MAX_N], t[MAX_N];
117
118 int main()
119 {
120     int T;scanf("%d",&T);
121     while(T--)
122     {
123         vector<char> v;
124         aho.init();
125         scanf("%d",&n);
126         int maxn = 0;
127         for(int i=1;i<=n;i++)
128         {
129             scanf("%s",s);
130             //aho.insert(s);
131             int sz = strlen(s);
132             for(int j=0;j<sz;j++) v.push_back(s[j]);
133             v.push_back('#');
134             if(sz > maxn)
135             {
136                 maxn = sz;
137                 strcpy(t, s);
138             }
139         }
140         int tot = 0;
141         for(int i=0;i<v.size();i++)
142         {
143             if(v[i] == '#')
144             {
145                 s[tot++] = 0;
146                 tot = 0;
147                 if(strcmp(s, t)) aho.insert(s);
148             }
149             else s[tot++] = v[i];
150         }
151         aho.build();
152         int ans = aho.match(t);
153         if(ans) puts(t);
154         else puts("No");
155     }
156 }

转载于:https://www.cnblogs.com/zzyDS/p/7570065.html

HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)相关推荐

  1. HDU 6208 The Dominator of Strings AC自动机

    题目链接:HDU 6208 The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535 ...

  2. hdu 6208 The Dominator of Strings

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6208 题意:给出n个字符串,判断某一个字符串是否包含了其他所有字符串. 分析:首先这个字符串一定是最长的那 ...

  3. HDU - 6208 The Dominator of Strings n次KMP 2017 ACM/ICPC Asia Regional Qingdao Online

    找到最长串 然后进行n次KMP #include <iostream> #include <cstdio> #include <cstdlib> #include ...

  4. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  5. HDU 5025 Saving Tang Monk(广州网络赛D题)

    HDU 5025 Saving Tang Monk 题目链接 思路:记忆化广搜,vis[x][y][k][s]表示在x, y结点,有k把钥匙了,蛇剩余状态为s的步数,先把图预处理出来,然后进行广搜即可 ...

  6. 2018 青岛网络赛C题Halting Problem

    判断一个指定的程序是一直运行下去还是会停止.停止好判断,就是如何判断是否会一直运行下去.当第二次到达第n步的时候,如果此时的r仍然是第一次到达第n步时候的r,那么这个程序会一直运行下去. 通过这道题还 ...

  7. hdu2017青岛网络赛Pythagoras(Tree of primitive Pythagorean triples)

    题面: Given a list of integers a0,a1,a2,⋯,a2k−1. Pythagoras triples over 109 are all solutions of x2+y ...

  8. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)

    题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...

  9. The Dominator of Strings HDU - 6208

    2018TYUT暑期ACM模拟赛(8) The Dominator of Strings HDU - 6208 题意:给你n个字符串找到一个字符串,可以包含给的所有串,如果存在就输出该字符串,不存在就 ...

最新文章

  1. 最短路径-Floyd(佛洛伊德算法)
  2. [学习笔记]后缀自动机
  3. 有关凸集的证明例题_第1章引言题解1. 用定义验证下列各集合是凸集: (1) S={(X1 ......
  4. linux下的web安全机制,linux http服务器web网页的不同安全机制
  5. 华为终端云服务赋能“智能座舱”,打造出行场景的“超级终端”
  6. ddr3配置 dsp6678_TMS320C6678外部存储器DDR3硬件设计以及软件调试
  7. [4G5G专题-59]:L3 RRC层-RRC层概述与总体架构、ASN.1消息、无线承载SRB, DRB、终端三种状态、MIB, SIB,NAS消息类型
  8. 未转变者临时服务器怎么开启,未转变者怎么开服务器 未转变者怎么创建服务器...
  9. iphone好的网站总结
  10. js页面中实现加载更多功能
  11. wifi 小程序 透传_微信小程序一键连wifi
  12. python绘制动漫人物图片女生可爱_日本动漫人物图片女生可爱图片大全
  13. python爬取微博热搜榜教程,python爬取微博热搜并存入表格
  14. 后端——获取提交的数据(GET、 POST)、获取上传的文件、常见的网络请求
  15. Chrome 快速清理某个地址缓存
  16. openssl命令生成根证书和使用根证书签名工作证书
  17. 前程无忧呼吁监管ATS(招聘管理平台)、举报非法社群简历买卖
  18. RV1109 EVB板使用流程
  19. UltraEdit激活版
  20. 13个人中找出叛徒的问题(耶稣问题)经典做法

热门文章

  1. IntelliJ IDEA 居然支持音视频聊天!
  2. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
  3. 用 Git 和 Github 提高效率的 10 个技巧!
  4. spring cloud config将配置存储在数据库中
  5. Tensorflow基础入门十大操作总结
  6. 你离开学只差这个视频:李宏毅机器学习2020版正式开放上线
  7. Coing-二叉树(bibary Tree)
  8. 机器学习拓展知识(数学/统计/算法)
  9. 特斯拉到底颠覆了什么?
  10. 当你舌吻十秒后,下面就……