p3966单词
后缀自动机版本:
所有的串用(char)('z'+1)连起来,然后建自动机。再用原串在自动机上跑。跑到的位置的endpos就是出现的次数。不过内存有点大。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=*SZ,APB=,one=,INF=0x7FFFFFFF,mod=;
int n,len,cnt,slink[SSZ],nex[SSZ][APB],maxlen[SSZ];
int minlen[SSZ],endpos[SSZ],in[SSZ];
char ch[SZ];
string str[SZ];
bool green[SSZ]; void add(string &x)
{
for(int i=;i<x.size();++i)
{
ch[++len]=x[i];
}
ch[++len]='z'+;
} int ins(int pre,int c)
{
int z=++cnt,u=pre;
green[z]=;
for(;u!=-&&!nex[u][c];u=slink[u])nex[u][c]=z;
maxlen[z]=maxlen[pre]+;
if(u==-)
{
slink[z]=;
}
else
{
int x=nex[u][c];
if(maxlen[x]==maxlen[u]+)
{
slink[z]=x;
}
else
{
int v=++cnt;
memcpy(nex[v],nex[x],sizeof(nex[x]));
maxlen[v]=maxlen[u]+;
slink[v]=slink[x];
minlen[v]=maxlen[slink[v]]+;
slink[x]=slink[z]=v;
minlen[x]=maxlen[v]+;
for(;u!=-&&nex[u][c]==x;u=slink[u])
nex[u][c]=v;
}
}
minlen[z]=maxlen[slink[z]]+;
return z;
} void topo()
{
for(int i=;i<=cnt;++i)
{
++in[slink[i]];
}
stack<int> stk;
for(int i=;i<=cnt;++i)
{
if(!in[i])stk.push(i),endpos[i]=;
}
for(;stk.size();)
{
int top=stk.top();
stk.pop();
int pre=slink[top];
endpos[pre]+=endpos[top],--in[pre];
if(!in[pre]&&pre)
{
if(green[pre])++endpos[pre];
stk.push(pre);
}
}
} void init()
{
cin>>n;
for(int i=;i<=n;++i)
{
cin>>str[i];
add(str[i]);
}
int pre=;
slink[]=-;
for(int i=;i<=len;++i)
{
pre=ins(pre,ch[i]-'a');
}
topo();
} int calc(string &x)
{
int cur=;
for(int i=;i<x.size();++i)
{
int c=x[i]-'a';
cur=nex[cur][c];
}
return endpos[cur];
} void work()
{
for(int i=;i<=n;++i)
{
cout<<calc(str[i])<<endl;
}
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
int casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(int time=1;time<=casenum;++time)
//for(int time=1;cin>>n>>qnum,n;++time)
{
//cout<<"Case "<<time<<": ";
init();
work();
}
return ;
}
p3966单词的更多相关文章
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- 洛谷P3966 单词 [TJOI2013] AC自动机
正解:AC自动机 解题报告: 传送门! 先来提供一个40pts错解QAQ 首先看到这题就会想到AC自动机板子题2鸭!然后就照着那题的套路打一下,随便改一点儿,简单来说就是每次经过一个节点都要++,然后 ...
- P3966 [TJOI2013]单词
P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...
- 洛谷P3966 [TJOI2013]单词(fail树性质)
P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...
- 洛谷P3966 [TJOI2013]单词(AC自动机)
题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...
- 洛谷P3966 [TJOI2013]单词(后缀自动机)
传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...
- 【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)
把单词连起来,中间插入间隔符,同 #include <cstdio> #include <queue> #include <cstring> using names ...
- Luogu P3966 [TJOI2013]单词
题目链接 \(Click\) \(Here\) 本题\(AC\)自动机写法的正解之一是\(Fail\)树上跑\(DP\). \(AC\)自动机是\(Trie\)树和\(Fail\)树共存的结构,前者可 ...
- [洛谷P3966][TJOI2013]单词
题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ...
随机推荐
- WEB服务器,TOMCAT和servlet之间的关系
WEB服务器,TOMCAT和servlet之间的关系 什么是WEB服务器Web服务器是指能够为发出请求的浏览器提供文档的程序.服务器是 一种被动程序,只有浏览器发出请求的时候才会响应.应用层使用 的是 ...
- vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2) 但是 2:7.3.429-2ubuntu2.1 正要被安装
sudo apt-get purge vim-common sudo apt-get update sudo apt-get upgrade sudo apt-get install vim Just ...
- windows中启动和终止nginx的两个批处理
文件:start_nginx.bat 内容: set nginx=D:\nginx-1.9.5\set php=D:\php\start /MIN %nginx%nginx.exestart /MIN ...
- 网络-04-端口号-linux端口详解大全--TCP注册端口号大全
# John Murphy <john.m.murphy&mci.com>afs3-fileserver 7000/tcp file server itselfafs3-files ...
- Github-记账本
- zabbix监控服务搭建
命令配置 浏览器配置: 检查必须全部ok(若有warning,检查是否漏装包,重启php-fpm服务) 数据库信息 主机名(zabbix server ip).端口号(默认).名字(随意) 配置摘要 ...
- Qt文档阅读笔记-QGraphicsItem::paint中QStyleOptionGraphicsItem *option的进一步认识
官方解析 painter : 此参数用于绘图;option : 提供了item的风格,比如item的状态,曝光度以及详细的信息:widget : 想画到哪个widget上,如果要画在缓存区上,这个参数 ...
- ELK学习笔记之ELK搜集OpenStack节点日志
模板来自网络,模板请不要直接复制,先放到notepad++内调整好格式,注意缩进 部署架构 控制节点作为日志服务器,存储所有 OpenStack 及其相关日志.Logstash 部署于所有节点,收集本 ...
- python实现简单算法
#选择n^2def selectSort(li): for i in range(len(li)-1): minLoc = i for j in range(i+1,len(li)): if li[j ...
- UWP中MarkupExtension的使用
Xaml作为一种描述语言,在编程中极大地简化了页面开发的繁琐及时间消耗,这得益于它的多种特性:数据绑定.动画.资源文件等等.标记扩展作为其一个特性,在xaml中有不可替代的作用,今天分析下自定义标记扩 ...