最长的才可能成为答案,那么除了最长的以外全部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 = + ;
  8. const int MAX_Tot = + ;
  9.  
  10. struct Aho
  11. {
  12. struct state
  13. {
  14. int nxt[];
  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=;i<size;i++)
  26. {
  27. memset(stateTable[i].nxt,,sizeof(stateTable[i].nxt));
  28. stateTable[i].fail = stateTable[i].cnt = ;
  29. }
  30. size = ;
  31. }
  32.  
  33. void insert(char *s)
  34. {
  35. int n = strlen(s);
  36. int now = ;
  37. for(int i=;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[].fail = -;
  50. que.push();
  51.  
  52. while(que.size())
  53. {
  54. int u = que.front();que.pop();
  55. for(int i=;i<;i++)
  56. {
  57. if(stateTable[u].nxt[i])
  58. {
  59. if(u == ) stateTable[stateTable[u].nxt[i]].fail = ;
  60. else
  61. {
  62. int v = stateTable[u].fail;
  63. while(v != -)
  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 == -) stateTable[stateTable[u].nxt[i]].fail = ;
  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 == -) break;
  86. stateTable[u].cnt = -;
  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 = , now = ;
  96. for(int i=;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 != - && stateTable[p].nxt[c-'a'] == ) p = stateTable[p].fail;
  104. if(p == -) now = ;
  105. else now = stateTable[p].nxt[c-'a'];
  106. }
  107.  
  108. Get(now);
  109. }
  110. for(int i=;i<size;i++) if(stateTable[i].cnt > ) return ;
  111. return ;
  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 = ;
  127. for(int i=;i<=n;i++)
  128. {
  129. scanf("%s",s);
  130. //aho.insert(s);
  131. int sz = strlen(s);
  132. for(int j=;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 = ;
  141. for(int i=;i<v.size();i++)
  142. {
  143. if(v[i] == '#')
  144. {
  145. s[tot++] = ;
  146. tot = ;
  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. }

HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)的更多相关文章

  1. HDU5880 Family View(2016青岛网络赛 AC自动机)

    题意:将匹配的串用'*'代替 tips: 1 注意内存的使用,据说g++中指针占8字节,c++4字节,所以用g++交会MLE 2 注意这种例子, 12abcdbcabc 故失败指针要一直往下走,否则会 ...

  2. hdu 6208 The Dominator of Strings【AC自动机】

    hdu 6208 The Dominator of Strings[AC自动机] 求一个串包含其他所有串,找出最长串去匹配即可,但是匹配时要对走过的结点标记,不然T死QAQ,,扎心了.. #inclu ...

  3. HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

    题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fa ...

  4. HDU 6208 The Dominator of Strings(AC自动机)

    The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  5. HDU 6208 The Dominator of Strings【AC自动机/kmp/Sunday算法】

    Problem Description Here you have a set of strings. A dominator is a string of the set dominating al ...

  6. HDU 6208 The Dominator of Strings 后缀自动机

    The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  7. HDU - 6208 The Dominator of Strings HDU - 6208 AC自动机 || 后缀自动机

    https://vjudge.net/problem/HDU-6208 首先可以知道最长那个串肯定是答案 然后,相当于用n - 1个模式串去匹配这个主串,看看有多少个能匹配. 普通kmp的话,每次都要 ...

  8. HDU 5884 Sort(2016年青岛网络赛 G 二分+贪心+小优化)

    好题 题意:给你n<=100000个数,每个数范围[0,1000],然后给你一个最大的代价T,每次最多合并k个数成为一个数,代价为k个数的总和.问最后合成1个数的总代价不大于T的最小k 题解:我 ...

  9. HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)

    题目链接  2016 Qingdao Online Problem I 题意  在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...

随机推荐

  1. head引入样式

    引入CSS(base基础样式,index页面样式): <link rel="stylesheet" type="text/css" href=" ...

  2. HTML学习摘要4

    DAY 4 text-align 属性规定了元素中文本的水平对齐方式: <html> <body> <h1 style="text-align:center&q ...

  3. c#读写apk的 comment

    写入: ZipFile zipFile = new ZipFile("C:\\Users\\Administrator\\Desktop\\2.apk"); zipFile.Beg ...

  4. python网络爬虫入门(二)

    刚去看了一下,18年2月份写了第一篇关于爬虫的文章(仅仅介绍了使用requests库去获取HTML代码),一年多之后看来很稚嫩也没有多少参考的意义,但没想着要去修改它,留着也是一个回忆吧.至少证明着我 ...

  5. RedHat6.9下替换yum源

    因为RedHat的yum需要收费,且要注册后才能使用.因此想把Yum源更新为CentOS的.使用的RedHat版本为6.9,因此对应的CentOS版本也要为6.9 1. 检查并删除原有的yum源 rp ...

  6. Ubuntu 用户权限相关命令

    目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01. 用户 和 权限 的基本概念 1.1 基本概念 用户 是 Linux 系统工作中重要的一环,用户管理包 ...

  7. Vue 文档Demo01

    Vue 1. Vue 基础 1. 声明式渲染 1. v-bind <!DOCTYPE html> <html> <head> <meta charset=&q ...

  8. vue $refs操作DOM

    原文链接:https://www.cnblogs.com/xumqfaith/p/7743387.html 如图,ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象 ...

  9. Mongodb之增删改查操作

    一.创建一个数据库 在我们使用MongoDB数据库时引进了这样一个知识,“对于mongodb,使用了不存在的对象,就等于在创建这个对象”,所以创建数据库的操作就比较简单 在我们使用mysql数据库时u ...

  10. 使用maven导入module时,报java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

    在新装IDEA导入Flink源码时出现一些问题,在此记录,希望能帮到大伙! 一.环境 IDEA2019.1.2(破解版):OpenJDK 1.8.0_40:Maven 3.5.3/3.2.5/3.6. ...