HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)
最长的才可能成为答案,那么除了最长的以外全部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自动机)相关推荐
- HDU 6208 The Dominator of Strings AC自动机
题目链接:HDU 6208 The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535 ...
- hdu 6208 The Dominator of Strings
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6208 题意:给出n个字符串,判断某一个字符串是否包含了其他所有字符串. 分析:首先这个字符串一定是最长的那 ...
- HDU - 6208 The Dominator of Strings n次KMP 2017 ACM/ICPC Asia Regional Qingdao Online
找到最长串 然后进行n次KMP #include <iostream> #include <cstdio> #include <cstdlib> #include ...
- 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 ...
- HDU 5025 Saving Tang Monk(广州网络赛D题)
HDU 5025 Saving Tang Monk 题目链接 思路:记忆化广搜,vis[x][y][k][s]表示在x, y结点,有k把钥匙了,蛇剩余状态为s的步数,先把图预处理出来,然后进行广搜即可 ...
- 2018 青岛网络赛C题Halting Problem
判断一个指定的程序是一直运行下去还是会停止.停止好判断,就是如何判断是否会一直运行下去.当第二次到达第n步的时候,如果此时的r仍然是第一次到达第n步时候的r,那么这个程序会一直运行下去. 通过这道题还 ...
- 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 ...
- HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)
题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...
- The Dominator of Strings HDU - 6208
2018TYUT暑期ACM模拟赛(8) The Dominator of Strings HDU - 6208 题意:给你n个字符串找到一个字符串,可以包含给的所有串,如果存在就输出该字符串,不存在就 ...
最新文章
- 最短路径-Floyd(佛洛伊德算法)
- [学习笔记]后缀自动机
- 有关凸集的证明例题_第1章引言题解1. 用定义验证下列各集合是凸集: (1) S={(X1 ......
- linux下的web安全机制,linux http服务器web网页的不同安全机制
- 华为终端云服务赋能“智能座舱”,打造出行场景的“超级终端”
- ddr3配置 dsp6678_TMS320C6678外部存储器DDR3硬件设计以及软件调试
- [4G5G专题-59]:L3 RRC层-RRC层概述与总体架构、ASN.1消息、无线承载SRB, DRB、终端三种状态、MIB, SIB,NAS消息类型
- 未转变者临时服务器怎么开启,未转变者怎么开服务器 未转变者怎么创建服务器...
- iphone好的网站总结
- js页面中实现加载更多功能
- wifi 小程序 透传_微信小程序一键连wifi
- python绘制动漫人物图片女生可爱_日本动漫人物图片女生可爱图片大全
- python爬取微博热搜榜教程,python爬取微博热搜并存入表格
- 后端——获取提交的数据(GET、 POST)、获取上传的文件、常见的网络请求
- Chrome 快速清理某个地址缓存
- openssl命令生成根证书和使用根证书签名工作证书
- 前程无忧呼吁监管ATS(招聘管理平台)、举报非法社群简历买卖
- RV1109 EVB板使用流程
- UltraEdit激活版
- 13个人中找出叛徒的问题(耶稣问题)经典做法