简略题意:问是否存在一个串,其他串都是他的子串。

看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了。
有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配。如果匹配到了所有串,那么答案存在。
具体做法就是每访问到一个节点,都看当前节点是否能匹配到某个串,以及这个节点一直在fail树上跳转到根部的这段路径上是否能匹配上某个串。
这题卡自动机做法主要在两点:
1. 卡读入,加了输入挂和不加输入挂相差500ms左右。
2. 每次暴力在fail树跳转需要花费一定时间,并且会重复遍历。
因为我们不需要知道每个字符串在最长串中出现的次数,因此对于遍历过的节点,不需要再重复遍历,加个标记即可。


#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#define maxn 27
using namespace std;int cnt[100010];int idx(char x) {return x-'a';
}struct Trie
{int next[500010][maxn],fail[500010];vector<int> end[500010];int root,L;int newnode(){for(int i = 0; i < maxn; i++)next[L][i] = -1;end[L++].clear();return L-1;}void init(){L = 0;root = newnode();}void insert(char *buf, int len, int th){int now = root;for(int i = 0; i < len; i++){if(next[now][idx(buf[i])] == -1)next[now][idx(buf[i])] = newnode();now = next[now][idx(buf[i])];}end[now].push_back(th);}void build(){queue<int>Q;fail[root] = root;for(int i = 0; i < maxn; i++)if(next[root][i] == -1)next[root][i] = root;else{fail[next[root][i]] = root;Q.push(next[root][i]);}while( !Q.empty() ){int now = Q.front();Q.pop();for(int i = 0; i < maxn; i++)if(next[now][i] == -1)next[now][i] = next[fail[now]][i];else{fail[next[now][i]]=next[fail[now]][i];Q.push(next[now][i]);}}}bool vis[500010];int query(string buf){for(int i = 0; i < L; i++)vis[i] = 0;int len = buf.size();int now = root;int res = 0;for(int i = 0; i < len; i++) {now = next[now][idx(buf[i])];int temp = now;while( temp != root ){if(vis[temp]) break;vis[temp] = 1;for(int i = 0; i < end[temp].size(); i++) {int v = end[temp][i];cnt[v]++;}temp = fail[temp];}}return res;}
};char s[1100000];
Trie ac;
int n;
int t;int main() {cin >> t;while(t--) {cin >> n;for(int i = 1; i <= n; i++)cnt[i] = 0;int maxv = 0, mid;string str;ac.init();for(int i = 1; i <= n; i++) {scanf("%s", s);int len = strlen(s);if(len > maxv)maxv = len, str = s;ac.insert(s, len, i);}ac.build();ac.query(str);int sum = 0;for(int i=1; i<=n; i++) {if(cnt[i])sum++;}for(int i = 0; i <= str.size(); i++)s[i] = str[i];if(sum != n) puts("No");else cout<<str<<'\n';}return 0;
}

大家都会写假算法,这游戏越来越难玩了…

#include <bits/stdc++.h>
#define maxn 27
using namespace std;string s[110000];int main() {cin.tie(0);ios::sync_with_stdio(0);int t, n;cin >> t;while(t--) {cin >> n;int maxv = 0;int id;for(int i = 1; i <= n; i++) {cin >> s[i];if(s[i].size() > maxv) {maxv = s[i].size();id = i;}}int cnt = 0;for(int i = 1; i <= n; i++) {if(s[id].find(s[i]) != -1) {cnt++;}}if(cnt ==n) cout<<s[id]<<'\n';else cout<<"No"<<'\n';}return 0;
}

HDU 6208 AC自动机 或 暴力?相关推荐

  1. HDU 6208 AC自动机

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. hdu 3962(AC自动机+矩阵优化dp)

    转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...

  4. hdu 2222 ac自动机

    对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...

  5. HDU 2222 AC自动机

    AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...

  6. HDU 6096 AC自动机

    题解:  主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...

  7. hdu 2222 AC 自动机 模版(数组实现)

    AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...

  8. HDU 2222(AC自动机模板)

    AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...

  9. HDU 2222 ac自动机模板

    题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...

最新文章

  1. 开启Mac充电提示音
  2. Webpack 4 + React + Typescript 搭建启动模版
  3. 【集合论】关系性质 ( 常见的关系的性质 | 关系性质示例 | 关系运算性质 )
  4. Django的学习需要掌握的一些基础和初步搭建自己的框架
  5. 【Java】Java Socket编程(1)基本的术语和概念
  6. do...while(0)的妙用
  7. JDK8那些惊为天人的新特性
  8. 全栈程序员这个月写了啥代码?
  9. MSSQL2000+ASP.NET+BBSMAX论坛搭建
  10. 用python做乘法口诀表_如何用python编写乘法口诀表
  11. C#,对接钉钉OA审批流程
  12. week4——实验题解(csp模拟1)
  13. 26.K-均值算法的优化目标、随机初始化、聚类数的选择
  14. Web 前端开发技术 ——html
  15. 【智能医疗】人工智能通过模拟疾病进程可预测老年痴呆
  16. 7-1 求一元二次方程的根 (20 分)
  17. 闲话网名之“J0ker”
  18. Struts2 S2-016/S2-017 命令执行带回显、看web路径、getshell e...
  19. Latex公式换行且不加编号
  20. 企业微信代运营方案怎么做 微信代运营网站有哪些

热门文章

  1. CommonView for wifi抓包破解WPA无线网络
  2. 用for循环语句计算8+88+888+8888+...前十项之和 Java(long类型)
  3. 兄弟hl3150cdn打印测试页6_3150cdn说明书
  4. [摘录]时间会证明一切
  5. 【首页】vue、element-ui首页界面框架
  6. 一体计算机屏幕只脚,这台嵌在显示器支架里的电脑 手撕笔记本 脚踹一体机!...
  7. 第二章 运算方法和运算部件
  8. 塔吊塔机远程告警监测设备
  9. 电脑监控软件能否提升员工工作效率?
  10. Android ijkplayer 编译踩坑与记录(ijk0.8.8--ffmpeg4.0)