[TJOI2013]单词 AC 自动机
题目描述:
小张最近在忙毕设,所以一直在读论文。
一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次。
题解:
AC 自动机裸题,将所有字符串读入到一个数组里,字符串之间用 “#” 隔开即可。
Code:
#include<string>
#include<vector>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin);
} #define maxn 2000004
vector<int>G[maxn];
char arr[maxn],total[maxn];
int tag[maxn],ans[maxn],map[maxn],cnt=-1;
struct Automaton{
#define idx str[i]-'a'
#define root 0
#define sigma 27
int ch[maxn][sigma],last[maxn],fail[maxn],end[maxn];
int nodes;
int newnode(){ return ++nodes;} void insert(char str[],int id){
int n=strlen(str);
int pos=root;
for(int i=0;i<n;++i){
if(!ch[pos][idx]) ch[pos][idx]=newnode();
pos=ch[pos][idx];
}
G[pos].push_back(id);
end[pos]=1;
map[id]=pos;
} queue<int>Q;
void build(){
for(int i=0;i<sigma;++i) if(ch[root][i]) { Q.push(ch[root][i]),fail[ch[root][i]]=root; }
while(!Q.empty()){
int u=Q.front(); Q.pop();
for(int i=0;i<sigma;++i){
int r=ch[u][i];
if(!r) { ch[u][i]=ch[fail[u]][i]; continue; }
Q.push(r);
fail[r]=ch[fail[u]][i];
last[r]=end[fail[r]]? fail[r]: last[fail[r]];
}
}
} bool vis[maxn];
void print(int j){
while(j){
if(end[j]) tag[j]+=1;
j=last[j];
}
} void query(char str[]){
int j=root;
for(int i=0;i<cnt;++i){
if(str[i]=='#') j=root;
else
{
j=ch[j][idx];
print(j);
}
}
} }aho;
int main(){
//setIO("input");
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%s",arr), aho.insert(arr,i);
int cur_n=strlen(arr);
for(int j=0;j<cur_n;++j)
total[++cnt]=arr[j];
total[++cnt]='#';
++cnt;
}
aho.build();
aho.query(total);
for(int i=0;i<maxn;++i)
for(int j=0;j<G[i].size();++j) ans[G[i][j]]+=tag[i];
for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
return 0;
}
[TJOI2013]单词 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 ...
- 洛谷P3966 [TJOI2013]单词(AC自动机)
题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...
- [TJOI2013]单词 AC自动机
题面: 洛谷 题解: 很久之前做的题了,只不过之前一直90....最近才发现是哪里写错了. 我们对字符集建AC自动机. 首先考虑一个暴力的做法,把文章当做一个长串,直接在自动机上跳,但是我们会发现,这 ...
- 【BZOJ 3172】[Tjoi2013]单词 AC自动机
关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...
- BZOJ3172[Tjoi2013]单词——AC自动机(fail树)
题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...
- BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树
题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...
- bzoj3172: [Tjoi2013]单词 ac自动机
某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...
随机推荐
- 88.NODE.JS加密模块CRYPTO常用方法介绍
转自:https://www.jb51.net/article/50668.htm 使用require('crypto')调用加密模块. 加密模块需要底层系统提供OpenSSL的支持.它提供了一种安全 ...
- 简单的beego分页功能代码
一个简单的beego分页小插件(源代码在最下面): 支持条件查询 支持参数保留 支持自定义css样式 支持表/视图 支持参数自定义 默认为pno 支持定义生成链接的个数 使用方式: 1)action中 ...
- 关于github里readme编辑的方法
实验室的老师昨天改完论文发我后,说按照例子改.于是才发现github里readme编辑满满的极客思维. 看了一下csdn给的教程 https://blog.csdn.net/Kaitiren/arti ...
- C++ STL next_permutation() prev_permutation(a,a+n)用法。
int a[3] = {1,2,3}; a可能形成的集合为{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}. {2,1,3}的prev是{1,3,2}, ...
- LastIndexOf干什么用的
LastIndexOf的作用是对字符串进行从后往前的检索,找到第一个匹配的位置.比如对字符串“abcdbcd”执行lastindexof("bc")操作,得到的结果是4:4是从前往 ...
- 使用python绘制词云
最近在忙考试的事情,没什么时间敲代码,一个月也没几天看代码,最近看到可视化的词云,看到网上也很多这样的工具, 但是都不怎么完美,有些不支持中文,有的中文词频统计得莫名其妙.有的不支持自定义形状.所有的 ...
- 洛谷P2766 最长不下降子序列问题 网络流_DP
Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm&g ...
- 设置div内的内容不能被选中
通过简单的css设置页面的文字无法被选定. <div class="select">我不能被选中复制</div> .select{ -webkit-user ...
- redis 篇 - 键 and string
redis 进入控制台 redis-cil 需要输入密码的时候可以是用 -a redis-cil -a abcd1234 redis 数据类型 string hash list set zset( 有 ...
- tinymce原装插件源码分析(一)-hr
tinymce简介 tinymce是一款能方便无限扩展的网页富文本编辑器. tinymce原装插件已经十分丰富,对于文本编辑(blog等文章)是绰绰有余,但是应对一些复杂的应用,比如在上面开发html ...