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的时候会出锅! 题意: 求一个字符串中本质不同的连续子串有几个,但是某串和它反转后的字符串算一个. 题解: 要注意的是,一般字符串题中的“ ...
随机推荐
- $("节点名").html("字符串")和$("节点名").text("字符串")区别
1. 经过html方法: $(".js_info").html("~!`@#$%^& ";'<>\=/-!·#¥%…&*()—+|` ...
- Unix/Linux系统时间函数API
首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...
- 技术分享:如何在PowerShell脚本中嵌入EXE文件
技术分享:如何在PowerShell脚本中嵌入EXE文件 我在尝试解决一个问题,即在客户端攻击中只使用纯 PowerShell 脚本作为攻击负荷.使用 PowerShell 运行恶意代码具有很多优点, ...
- Spiral Matrix I & II
Spiral Matrix I Given an integer n, generate a square matrix filled with elements from 1 to n^2 in s ...
- 牛x的JavaScript编辑器你知道几个
英文:Martin Heller 译文:葡萄城控件 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群343599877,我们一起学前端! 对于JavaScript程序员来说,目前有很 ...
- SQL语句添加删除修改字段
用SQL语句添加删除修改字段1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME ...
- HTML标签列表总览
超文本标记语言(简称:HTML)标记标签通常被称为HTML标签,HTML标签是HTML语言中最基本的单位,HTML标签是HTML(标准通用标记语言下的一个应用)最重要的组成部分.HTML标签的大小写无 ...
- Robots.txt 不让搜索引擎收录网站的方法
有没有担心过自己的隐私会在强大的搜索引擎面前无所遁形?想象一下,如果要向世界上所有的人公开你的私人日记,你能接受吗?的确是很矛盾的问题,站长们大都忧虑“如何让搜索引擎收录的我的网站?”,而我们还是要研 ...
- 不用的代码,存一份--用tornado实现的websocket
因为现在使用Channels来实现啦, 这样就在Django的体系里自已弄完了. 方便后期代码维护和服务器部署. 这份土陋的东东,就放起来吧. 毕竟,通过读取文件来返回实时websocket,不适应于 ...
- JavaScript 三个常用对话框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...