【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)
把单词连起来,中间插入间隔符,同
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct Node{
    int fail, next[27], num;
}AC[200010];
int n, u, cnt;
queue <int> q;
int p[1000010], vis[1000010];
char a[2000010], b[1000010];
int f[1000010];
int lena;
struct Edge{
	int next, to;
}e[200010];
int head[200010], num;
inline void Add(int from, int to){
	e[++num].to = to; e[num].next = head[from]; head[from] = num;
}
void insert(int x){
    int len = strlen(b + 1), w;
    u = 0;
    for(int i = 1; i <= len; ++i){
        w = b[i] - 'a';
        if(!AC[u].next[w])
          AC[u].next[w] = ++cnt;
        u = AC[u].next[w];
    }
    f[x] = u;
}
void BuildFail(){
	u = 0;
    for(int i = 0; i < 26; ++i)
       if(AC[u].next[i])
         q.push(AC[u].next[i]);
    while(q.size()){
        u = q.front(); q.pop();
        for(int i = 0; i < 26; ++i)
           if(AC[u].next[i]){
           	 q.push(AC[u].next[i]);
             AC[AC[u].next[i]].fail = AC[AC[u].fail].next[i];
           }
           else
		     AC[u].next[i] = AC[AC[u].fail].next[i];
    }
}
void Match(){
    int len = lena;
    u = 0;
    for(int i = 1; i <= len; ++i){
        u = AC[u].next[a[i] - 'a'];
        ++vis[u];
    }
}
void dfs(int x){
	for(int i = head[x]; i; i = e[i].next){
		dfs(e[i].to); vis[x] += vis[e[i].to];
	}
}
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) f[i] = i;
    for(int i = 1; i <= n; ++i){
     	scanf("%s", b + 1);
     	int len = strlen(b + 1);
    	insert(i);
    	for(int i = 1; i <= len; ++i)
    	   a[++lena] = b[i];
    	a[++lena] = 'z' + 1;
    }
    BuildFail();
    Match();
    for(int i = 1; i <= cnt; ++i)
       Add(AC[i].fail, i);
    dfs(0);
    for(int i = 1; i <= n; ++i)
       printf("%d\n", vis[f[i]]);
    return 0;
}
【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)的更多相关文章
- 洛谷P3966 [TJOI2013]单词(AC自动机)
		题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ... 
- 洛谷P3966 [TJOI2013]单词(fail树性质)
		P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ... 
- 洛谷P3966 [TJOI2013]单词(后缀自动机)
		传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ... 
- [洛谷P3966][TJOI2013]单词
		题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ... 
- [TJOI2013]单词 AC自动机
		题面: 洛谷 题解: 很久之前做的题了,只不过之前一直90....最近才发现是哪里写错了. 我们对字符集建AC自动机. 首先考虑一个暴力的做法,把文章当做一个长串,直接在自动机上跳,但是我们会发现,这 ... 
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
		3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ... 
- 【BZOJ3172】[Tjoi2013]单词 AC自动机
		[BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ... 
- bzoj 3172: [Tjoi2013]单词 AC自动机
		3172: [Tjoi2013]单词 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ... 
- BZOJ3172 & 洛谷3966  [Tjoi2013]单词    【fail树】
		3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4293 Solved: 2083 [Submit][Stat ... 
- 洛谷-P5357-【模板】AC自动机(二次加强版)
		题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ... 
随机推荐
- SSM项目实战 之 Maven
			目录 Maven 简介 Maven是什么 Maven下载安装 Maven使用 Maven规定了一套默认的项目格式 创建第一个Maven项目 Maven仓库 Maven常用命令 Maven作用范围(sc ... 
- 最精简使用MORMOT
			MORMOT是免费开源的SDK,它封装了HTTP.SYS,这是许多人使用它的原因,让人难以想像的是它居然支持DELPHI6及以上版本. 但MORMOT本身已经被封装的很庞大,它提供许多的单元,这让人不 ... 
- Netty 读写检测机制(心跳)
			一.创建服务端 1.MyServer 类 public class MyServer { public static void main(String[] args) throws Exception ... 
- linux 的 两种磁盘扩容
			当LVM分区空间不足的时候,可以进行扩容.主要的扩容方法有两种: 通过空余的磁盘进行扩容,这个方法比较简单,不会对原有数据有影响.将其他LVM分区空间取出一部分给需要扩容的LVM分区.下面就分别具体介 ... 
- PyCharm虚拟环(Project Interpreter)手动安装第三方包图解教程
			PyCharm虚拟环(Project Interpreter)手动安装第三方包图解教程 an鑫_wolfxin2010 关注 2018.03.13 21:58* 字数 313 阅读 3782评论 1喜 ... 
- redis 使用redis Desktop manger进行远程进行链接
			1.修改redis.conf文件: a.去掉bind:127.0.0.0 b.protected mode 模式改成 no 2.重启redis /etc/init.d/redis restart 3. ... 
- 爬虫中Requests模块
			Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “ ... 
- C语言 运算符优先级
			规律小结: 结合方向只有三个是从右往左,其余都是从左往右. 所有双目运算符中只有赋值运算符的结合方向是从右往左. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算 ... 
- 几种常见的java网页静态化技术对比
			名称 优点 缺点 使用场景 jsp 1.功能强大,可以写java代码 2.支持jsp标签(jsp tag) 3.支持表达式语言(el) 4.官方标准,用户群广,丰富的第三方jsp标签库 5.性能良好. ... 
- docker安装并运行mongo
			拉镜像: [mall@VM_0_7_centos ~]$ sudo docker pull mongo:3.2 [sudo] password for mall: 3.2: Pulling from ... 
