HDU 4641 K-string 后缀自动机 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4641
https://blog.csdn.net/asdfgh0308/article/details/40969047
给一个小写字母字符串,1 a表示在字符串尾部添加一个小写字母a,2 表示当前有多少种子串出现次数大于等于K。
求出现次数桶排序(说是拓扑排序也可以?)就阔以了,种类就是t[i].len-t[t[i].f].len。
在线处理是直接扫描,时间复杂度是O(树高*m)。
离线做法是先把所有添加操作都做完,然后去掉字母反向求子串种数,可以使用并查集降低时间复杂度(每个连通块中只有总父亲表示的子串对当前答案有贡献,保证了每个点的平均扫描次数)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
int n,m,K;
char ch[maxn*],ch1[];
int e[maxn*]={},b[maxn*]={},siz;
struct nod{
int sig[],f,len;
}t[maxn*]; int tot,la; int cnt[maxn*]={},rk[maxn*]={};
int fa[maxn*]={},sub[maxn*]={},g[maxn*]={};
LL ans[maxn*]={}; void addit(int z){
int x=++tot,i=la; t[x].len=t[i].len+;
b[siz]=x;
for(;i&&!t[i].sig[z];i=t[i].f)t[i].sig[z]=x;
if(!i)t[x].f=;
else{
int y=t[i].sig[z];
if(t[y].len==t[i].len+)t[x].f=y;
else{
int p=++tot;
t[p]=t[y];t[p].len=t[i].len+;
t[y].f=t[x].f=p;
for(;i&&t[i].sig[z]==y;i=t[i].f)t[i].sig[z]=p;
}
}
la=x;
}
void msort(){
int i;
for(i=;i<=siz;i++)cnt[i]=;
for(i=;i<=tot;i++)cnt[t[i].len]++;
for(i=;i<=siz;i++)cnt[i]+=cnt[i-];
for(i=tot;i>;i--)rk[cnt[t[i].len]--]=i;
}
int getfa(int x){
int y=x,z;
while(y!=fa[y])y=fa[y];
while(x!=fa[x]){ z=x; x=fa[x];fa[z]=y;}
return fa[x];
}
int main(){
int i,p,y; LL num;
while(~scanf("%d%d%d",&n,&m,&K)){
memset(t,,sizeof(t)); tot=; la=; siz=;
scanf("%s",ch);
for(i=;i<n;++i){ addit(ch[i]-'a'); ++siz; }
for(i=;i<=m;i++){
scanf("%d",&e[i]);
if(e[i]==){ scanf("%s",ch1); addit(ch1[]-'a'); ch[siz++]=ch1[]; }
}
msort(); p=,num=;
for(i=;i<=tot;i++){ g[i]=; fa[i]=i; sub[i]=;}
for(i=;i<siz;++i){ p=t[p].sig[ch[i]-'a']; ++g[p]; }
for(i=tot-;i>;i--){ p=rk[i]; if(t[p].f!=)g[t[p].f]+=g[p]; }
for(i=;i<=tot;++i){ if(g[i]>=K) num+=t[i].len-t[t[i].f].len; }
for(i=m;i>;i--){
if(e[i]==)ans[i]=num;
else{
p=b[--siz];
y=getfa(p);
while(y!=&&g[y]<K){ fa[y]=getfa(t[y].f); y=fa[y];}
y=getfa(p);
if(y==)continue;
sub[y]++;
while(y!=&&(g[y]-sub[y]<K)){
num-=t[y].len-t[t[y].f].len;
p=getfa(t[y].f);
sub[p]+=sub[y]; fa[y]=p;
y=fa[y];
}
}
}
for(i=;i<=m;++i)if(e[i]==)printf("%lld\n",ans[i]);
}
return ;
}
HDU 4641 K-string 后缀自动机 并查集的更多相关文章
- BZOJ 4566 JZYZOJ 1547 [haoi2016T5]找相同子串 后缀数组 并查集
http://172.20.6.3/Problem_Show.asp?id=1547 http://www.lydsy.com/JudgeOnline/problem.php?id=4566 单纯后缀 ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- NOI 2015 品酒大会 (后缀数组+并查集)
题目大意:略 40分暴力还是很好写的,差分再跑个后缀和 和 后缀最大值就行了 一种正解是后缀数组+并查集 但据说还有后缀数组+单调栈的高端操作蒟蒻的我当然不会 后缀数组求出height,然后从大到小排 ...
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- 51 nod 1456 小K的技术(强连通 + 并查集)
1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...
- HDU 4622 Reincarnation(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4622 [题目大意] 给出一个长度不超过2000的字符串,有不超过10000个询问,问[L,R]子串 ...
- HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 牛客多校第四场 I string 后缀自动机/回文自动机
这个回文自动机的板有问题,它虽然能过这道题,但是在计算size的时候会出锅! 题意: 求一个字符串中本质不同的连续子串有几个,但是某串和它反转后的字符串算一个. 题解: 要注意的是,一般字符串题中的“ ...
随机推荐
- http、https 等 常用默认端口号
⑴. HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080⑵. SOCKS代理协议服务器常用端口号:1080⑶. FTP(文件传输)协议代理服务器常用端口号:21⑷. Tel ...
- 使用IntelliJ IDEA新建maven的javaWeb项目部署,启动访问index,jsp页面
对于用惯了eclipse的人,idea其实还挺不一样的,也是摸索了很久,看了好多博客,这里就记录一下,以后肯定经常用!,不过使用熟练了,功能确实非常强大,真的牛! 1 新建maven项目,配置好目录结 ...
- Ubuntu下 git 服务器的搭建【转】
转自:http://www.open-open.com/lib/view/open1391477731082.html 搭建git服务器的4个步骤 1 配置服务器前的准备工作 首先ubuntu系统 ...
- docker安装(2018-03-14版本)
[安装] 说明一: CENTOS或RHEL自带的docker源不一定是最新的,所以必须到docker.com去找到最新的yum源进行安装 说明二: docker的安装方式有两种: 1. 从指定网站获取 ...
- 读书笔记--C陷阱与缺陷(四)
第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一 ...
- wpf image blur
RenderOptions.BitmapScalingMode="NearestNeighbor"
- js对象的属性:数据(data)属性和访问器(accessor)属性
此文为转载,原文: 深入理解对象的数据属性与访问器属性 创建对象的方式有两种:第一种,通过new操作符后面跟Object构造函数,第二种,对象字面量方式.如下 var person = new Obj ...
- oplog扩容
Oplog的扩容: 背景:一个由3个节点组成的复制集. 主节点:A 从节点:B,C 需求:Oplog扩容,尽量少的影响业务. 思路:先由从节点开始,一台一台的从复制集中剥离,修改,再回归复制集,最后操 ...
- CentOS7.5搭建ELK6.2.4集群及插件安装
一 简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术. 下载地址 ...
- 流程设计器jQuery + svg/vml(Demo7 - 设计器与引擎及表单一起应用例子)
去年就完成了流程设计器及流程引擎的开发,本想着把流程设计器好好整理一下,形成一个一步一步的开发案例,结果才整理了一点点,发现写文章比写代码还累,加上有事情要忙,结果就.. 明天要去外包驻场了,现把流程 ...