比较考验对后缀自动机构建过程的理解.

之前看题解写的都是树链的并,但是想了想好像可以直接撤销,复杂度是线性的.

自己想出来的,感觉后缀自动机的题应该不太能难倒我~

注意:一定要手画一下后缀自动机的构建过程,然后看着自己画的图一步一步模拟即可.

Code:

#include <stack>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200003
#define ll long long
#define setIO(s) freopen(s".in","r",stdin) // ,freopen(s".out","w",stdout)
using namespace std;
struct Node
{
int node,i,p,fanq,q;
Node(int node=0,int i=0,int p=0,int fanq=0,int q=0):node(node),i(i),p(p),fanq(fanq),q(q){}
};
ll now;
char S[N];
stack<Node>sta;
int ch[N][26],f[N],len[N],pre[N],tot,n,C[N];
int extend(int lst,int c)
{
int np=++tot,p=lst;
len[np]=len[p]+1;
for(;p&&!ch[p][c];p=f[p]) ch[p][c]=np;
if(!p) f[np]=1;
else
{
int q=ch[p][c];
if(len[q]==len[p]+1) f[np]=q;
else
{
int nq=++tot;
len[nq]=len[p]+1, f[nq]=f[q], f[np]=f[q]=nq;
sta.push(Node(nq,np,p,f[nq],q));
memcpy(ch[nq],ch[q],sizeof(ch[q]));
for(;p&&ch[p][c]==q;p=f[p]) ch[p][c]=nq;
}
}
now+=(ll)len[np]-len[f[np]];
sta.push(Node(np,np,lst,0,0));
return np;
}
int main()
{
int i,j,cur;
scanf("%s",S+1),n=strlen(S+1);
cur=pre[1]=tot=1;
for(i=1;i<=n;++i)
{
if(S[i]=='-')
{
while(!sta.empty() && sta.top().i==cur)
{
Node e=sta.top(); sta.pop();
if(e.fanq)
{
int p=e.p,fanq=e.fanq,nq=e.node,q=e.q,c=C[e.i];
for(;p&&ch[p][c]==nq;p=f[p]) ch[p][c]=q;
f[q]=f[nq];
}
else
{
int np=e.node,p=e.p,c=C[e.i];
now-=(len[np]-len[f[np]]);
for(;p&&ch[p][c]==np;p=f[p]) ch[p][c]=0;
}
}
cur=pre[cur];
}
else
{
int x=cur;
cur=extend(x,S[i]-'a'), pre[cur]=x, C[cur]=S[i]-'a';
}
printf("%lld\n",now);
}
return 0;
}

  

BZOJ 5084: hashit 后缀自动机(原理题)的更多相关文章

  1. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题

    链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...

  2. SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)

    题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...

  3. BZOJ 2882: 工艺( 后缀自动机 )

    把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...

  4. bzoj 3277 & bzoj 3473,bzoj 2780 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...

  5. spoj - Longest Common Substring(后缀自动机模板题)

    Longest Common Substring 题意 求两个串的最长公共子串. 分析 第一个串建后缀自动机,第二个串在自动机上跑,对于自动机上的结点(状态)而言,它所代表的最大长度为根结点到当前结点 ...

  6. bzoj 2555 SubString —— 后缀自动机+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 建立后缀自动机,就可以直接加入新串了: 出现次数就是 Right 集合的大小,需要查询 ...

  7. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...

  8. POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)

    后缀数组: #include<cstdio> #include<algorithm> #include<cstring> #include<vector> ...

  9. Match & Catch CodeForces - 427D 后缀自动机水题

    题意: 给出两个字符串a,b,求一个字符串,这个字符串是a和b的子串, 且只在a,b中出现一次,要求输出这个字符串的最小长度. 题解: 将a串放入后缀自动机中,然后记录一下每个节点对应的子串出现的次数 ...

随机推荐

  1. SIFT图像配准 python3.6 + opencv3.3代码

    opencv3.x 中部分函数有改变: 1. SIFT:可以采用help(cv2.xfeatures2d)查询 2.drawKeypoints: 同样采用help()方法查询 opencv3 版本si ...

  2. mysql大数据量插入参考

    Mysql 千万数据10秒批量插入只需三步第一步:配置my.ini文件文件中配置bulk_insert_buffer_size=120M 或者更大将insert语句的长度设为最大.Max_allowe ...

  3. 【转帖】超能课堂(188) WiFi 6凭什么可以如此“六”?

    https://www.expreview.com/69155.html 不明觉厉 这些东西 自己理解的还是少呢 电脑硬件可能一年甚至不到一年就会开始更新换代,但是路由器就不一样,它们的更新换代往往是 ...

  4. 从入门到自闭之Python while如何使用

    while 循环 ​ while 条件: ​ 循环体 终止循环的两种办法: 改变条件 break break和continue的用法: break 用法:打破当前循环,(终止当前循环),所处位置在循环 ...

  5. Ruby Rails正式学习:Ruby on Rails 做个演示项目吧,逐渐完善

    项目开始 一. 新建Rails项目 1. 修改一下Gemfile文件(简单修改一下) source 'https://rubygems.org' git_source(:github) { |repo ...

  6. TCP/IP 协议是如何保证数据可靠性的?

    原文: 网络基础:TCP协议-如何保证传输可靠性 TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP ...

  7. Vue首页加载过慢 解决方案

    一.什么导致了首页初步加载过慢:app.js文件体积过大 二.解决方法: 1.Vue-router懒加载 vue-router懒加载可以解决首次加载资源过多导致的速度缓慢问题:vue-router支持 ...

  8. Postman之前言

    Postman是一款流行的接口api调试/测试工具.几乎可以发送大多数的HTTP请求. 1.依据开发提供的接口文档,对接口进行测试. 2.如果是自己学习,可以网上找一些免费的接口进行学习,或者抓包 - ...

  9. 前端之BOM,DOM

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  10. JS根据一个经纬度及距离角度,算出另外一个经纬度

    var mapNumberUtil = {}; /** * 根据一个经纬度及距离角度,算出另外一个经纬度 * @param {*} lng 经度 113.3960698 * @param {*} la ...