AC自动机模板题。

复习了一下,一开始超时了。2个地方很关键:

1.初始化树时的t不能直接memset(t,-1,sizeof(t)),多组数据直接超时。

2.计算贡献的时候,贡献过得点标记,下次往上跳fail时就直接不做了,保证了复杂度。

题解:想一想就知道模式串就是最长的那个,若有多个一样长的,任一取一个,因为多个一样长的,则必须一摸一样才合法,所以就没有任何区别了。

于是就变成模板题了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define eps 1e-9
#define nn 100005
using namespace std;queue<int>Q;
int t[nn][26],T,now,n,mal,tag[nn],fail[nn],l,root;
char b[nn],M[nn];
int tot;void insert(int w){now=root;for (int j=1;j<=l;j++){if (t[now][b[j]-'a']==-1) {t[now][b[j]-'a']=++tot;memset(t[tot],-1,sizeof(t[tot]));}now=t[now][b[j]-'a'];if (j==l)tag[now]++;}
}
void build(){for (int i=0;i<26;i++)     if (t[0][i]==-1)t[0][i]=0;else {fail[t[0][i]]=0;Q.push(t[0][i]);}fail[0]=0;int o=0;while (!Q.empty()){now=Q.front();Q.pop();for (int i=0;i<26;i++){if (t[now][i]==-1)t[now][i]=t[fail[now]][i];else fail[t[now][i]]=t[fail[now]][i],Q.push(t[now][i]);}    }
}int main(){//freopen("A.in","r",stdin);scanf("%d",&T);root=0;while (T--){memset(t[0],-1,sizeof(t[0]));tot=0;memset(fail,0,sizeof(fail));memset(tag,0,sizeof(tag));scanf("%d",&n);mal=0;for (int i=1;i<=n;i++){scanf("%s",b+1);l=strlen(b+1);    insert(i);if (l>mal){mal=l;for (int j=1;j<=l;j++)M[j]=b[j];}}l=mal;build();now=root;int tem=0,temp;for (int i=1;i<=l;i++){while(t[now][M[i]-'a']==-1&&now>0)now=fail[now];now=t[now][M[i]-'a'];temp=now;while (temp>0&&tag[temp]!=-1)tem+=tag[temp],tag[temp]=-1,temp=fail[temp];}if (tem==n){for (int i=1;i<=l;i++)printf("%c",M[i]);puts("");}else puts("No");}return 0;
}

2017青岛网络赛 C - 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. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  3. HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)

    最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案.事实上方便起见这个最长串一起丢进去也无妨,而且 ...

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

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

  5. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  6. 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 ...

  7. 2017 ccpc网络赛 1001 Vertex Cover(二分图 构造)HDU6150

    题意:"最小点覆盖集"是个NP完全问题 有一个近似算法是说-每次选取度数最大的点(如果有多个这样的点,则选择最后一个) 让你构造一个图,使得其近似算法求出来点数是你给定的覆盖点数的 ...

  8. 2017西安网络赛B_Coin

    样例输入 2 2 1 1 3 1 2 样例输出 500000004 555555560 思路: n重伯努利实验概率分布题. 设q=1-p,p为事件概率. Y为出现偶数次的概率. 所以  Y=1/2*( ...

  9. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  10. The Dominator of Strings HDU - 6208

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

最新文章

  1. Coding and Paper Letter(二十)
  2. android内存碎片化怎么处理,安卓越用越卡毛病有解了!ColorOS内存反碎片化引擎让手机久用不卡...
  3. 用JScript.net写.net应用程序(转)
  4. linux 6.7 nfs安装yum,centos6.7下安装配置NFS
  5. C++判断文件是否存在
  6. 并行执行,没用到过,写到这里免得搞忘
  7. Java类class isAnnotation()方法及示例
  8. 关于linux内核中使用的时钟
  9. LYNC功能之呼叫合并
  10. 百战程序员python百度网盘_【百战程序员】Python 文件I/O
  11. Tampermonkey油猴脚本安装及入门
  12. Vm虚拟机Deepin安装教程---kalrry
  13. 记Vivado使用,报错记录本
  14. progisp下载错误-error:could not find USBASP device
  15. 一般总账科目 调整 为统驭科目时报错:只以本位币计的统驭科目余额未定义
  16. mcgscom口针脚定义_标准9针串口引脚定义
  17. java一元多项式减法运算_一元多项式的表示及加减乘除运算
  18. 验证google webrtc服务器demo(apprtc)使用的turn/stun服务器
  19. Linux下Oracle开机自启动
  20. Flume+Kafka+Strom基于伪分布式环境的结合使用

热门文章

  1. DEDECMS留言薄全站调用方法
  2. 如何在PDF上添加电子签名?签名技巧分享
  3. 第四章 姜诸儿意气风发登君位 鲁桓公窝囊枉死彭生手
  4. Chrome浏览器默认新标签页空白怎么办
  5. 台式计算机主要硬件设备有哪些,电脑基本硬件有哪些
  6. Excel删除重复值
  7. 基于纠错编码的数字水印matlab,method robustness是什么意思
  8. C++搜索算法和曼哈顿距离之最少连通代价
  9. 怎样更改计算机应用图标,win7如何更改软件图标_win7修改应用程序图标的教程
  10. linux sticky,session_sticky命令