洛谷P3966 [TJOI2013]单词(后缀自动机)
统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说……
统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了
然后考虑怎么让所有串之间隔开。本来打算建个广义SAM后来发现没办法处理子串重复的情况……然后就按题解里的方法在每两个串之间加入一个新字符然后直接对整个串建好了
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=4e6+;
int fa[N],ch[N][],l[N],cnt[N],last=,tot=;
char s[N>>],t[N>>];int len[N>>],c[N],a[N],k,ans[N],n;
void ins(int c){
int p=last,np=++tot;last=np,l[np]=l[p]+,cnt[np]=;
for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=;
else{
int q=ch[p][c];
if(l[q]==l[p]+) fa[np]=q;
else{
int nq=++tot;l[nq]=l[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q],fa[q]=fa[np]=nq;
for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
}
inline void calc(){
for(int i=;i<=tot;++i) ++c[l[i]];
for(int i=;i<=tot;++i) c[i]+=c[i-];
for(int i=;i<=tot;++i) a[c[l[i]]--]=i;
for(int i=tot;i;--i) cnt[fa[a[i]]]+=cnt[a[i]];
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%s",t+);len[i]=strlen(t+);
for(int j=;j<=len[i];++j) ins(s[++k]=t[j]-'a');
ins(s[++k]=);
}
calc();k=;
for(int i=,x,j;i<=n;++i){
for(j=,x=;j<=len[i];++j)
x=ch[x][s[++k]];
ans[i]=cnt[x];
++k;
}
for(int i=;i<=n;++i) printf("%d\n",ans[i]);
return ;
}
洛谷P3966 [TJOI2013]单词(后缀自动机)的更多相关文章
- 洛谷P3966 [TJOI2013]单词(AC自动机)
题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...
- 洛谷P3966 [TJOI2013]单词(fail树性质)
P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...
- [洛谷P3966][TJOI2013]单词
题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ...
- BZOJ3172 & 洛谷3966 [Tjoi2013]单词 【fail树】
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4293 Solved: 2083 [Submit][Stat ...
- 洛谷P4248 [AHOI2013]差异(后缀自动机求lcp之和)
题目见此 题解:首先所有后缀都在最后一个np节点,然后他们都是从1号点出发沿一些字符边到达这个点的,所以下文称1号点为根节点,我们思考一下什么时候会产生lcp,显然是当他们从根节点开始一直跳相同节点的 ...
- P3966 [TJOI2013]单词
P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...
- BZOJ_3172_[Tjoi2013]单词_AC自动机
BZOJ_3172_[Tjoi2013]单词_AC自动机 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- [TJOI2013]单词 AC自动机
题面: 洛谷 题解: 很久之前做的题了,只不过之前一直90....最近才发现是哪里写错了. 我们对字符集建AC自动机. 首先考虑一个暴力的做法,把文章当做一个长串,直接在自动机上跳,但是我们会发现,这 ...
随机推荐
- Java_总结_00_资源贴
1.Java程序员从笨鸟到菜鸟 (http://blog.csdn.net/column/details/java.html) 2. java进阶开发(http://blog.csdn.net/col ...
- Oracle修改字段名、字段数据类型
语句:alter table tableName rename column oldCName to newCName; -- 修改字段名alter table tableName modify (c ...
- bzoj1002轮状病毒
高精度练习题 根据什么什么基尔霍夫矩阵 反正就是高精度练习 #include<iostream> #include<cstdio> using namespace std; s ...
- 记一次编译tensorflow-gpu爬过的坑
废话不多说,先说最终成功的版本:系统=>centos7 ,cuda=>10.0 ,cudnn=>7.5 ,nccl=>源码编译, tensorflow=>最新版本源码编译 ...
- java多线程编程核心技术——第四章总结
第一节使用ReentrantLock类 1.1使用ReentrantLock实现同步:测试1 1.2使用ReentrantLock实现同步:测试2 1.3使用Condition实现等待/同步错误用法与 ...
- 照片Urls
http://img.my.csdn.net/uploads/201402/16/1392530364_7835.jpg http://img.my.csdn.net/uploads/201402/1 ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- c++17 filesystem, regex 遍历目录
linux 遍历目录+文件(优化版本) c++17 FS 还是挺好用的, VS2017支持,但是linux g++7.3 还是不支持 filesystem #include<filesystem ...
- VBS调用并监控记事本进程
Dim flag flag=true Set WshShell = CreateObject("WScript.Shell") '创建WScript.Shell对象 Set ...
- go 语言 基础 类型(1)
变量 使用关键字 var定义变量,自动初始化为0值.如果提供初始化值,可省略变量类型,由编译器自动推断. 在函数内部可以使用 := 方式定义变量 func main() { x := 123 } 可一 ...