2019.03.01 bzoj2555: SubString(sam+lct)
传送门
题意简述:
要求在线支持两个操作
(1):在当前字符串的后面插入一个字符串
(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)
思路:
考虑用lctlctlct来动态维护samsamsam的rightrightright集合。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1200005;
char s[N];
int n;
string str;
inline void gets(int Mask){
scanf("%s",s);
str=s;
for(ri i=0,up=str.size();i<up;++i){
Mask=(Mask*131+i)%up;
char t=str[i];
str[i]=str[Mask];
str[Mask]=t;
}
}
int Mask=0;
namespace lct{
int son[N][2],rev[N],siz[N],fa[N],add[N],stk[N],top=0;
inline void pushnow(int p,int v){siz[p]+=v,add[p]+=v;}
inline void pushdown(int p){if(add[p])pushnow(son[p][0],add[p]),pushnow(son[p][1],add[p]),add[p]=0;}
inline bool isroot(int p){return !fa[p]||((p^son[fa[p]][0])&&(p^son[fa[p]][1]));}
inline bool which(int p){return p^son[fa[p]][0];}
inline void rotate(int x){
int y=fa[x],z=fa[y],t=which(x);
if(z&&!isroot(y))son[z][which(y)]=x;
fa[y]=x,fa[x]=z,son[y][t]=son[x][t^1],son[x][t^1]=y;
if(son[y][t])fa[son[y][t]]=y;
}
inline void splay(int x){
stk[top=1]=x;
for(ri p=x;!isroot(p);p=fa[p])stk[++top]=fa[p];
while(top)pushdown(stk[top--]);
while(!isroot(x)){if(!isroot(fa[x]))rotate(which(x)^which(fa[x])?x:fa[x]);rotate(x);}
}
inline void access(int x){for(ri y=0;x;x=fa[y=x])splay(x),son[x][1]=y;}
inline void link(int x,int y){fa[x]=y,access(y),splay(y),pushnow(y,siz[x]);}
inline void cut(int x){access(x),splay(x),pushnow(son[x][0],-siz[x]),fa[son[x][0]]=0,son[x][0]=0;}
}
namespace sam{
int son[N][26],len[N],Link[N],tot=1,last=1;
inline void insert(int x){
int p=last,np=++tot;
lct::siz[np]=1,len[last=np]=len[p]+1;
while(p&&!son[p][x])son[p][x]=np,p=Link[p];
if(!p)return lct::link(np,Link[np]=1);
int q=son[p][x],nq;
if(len[q]==len[p]+1)return lct::link(np,Link[np]=q);
len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[nq]));
lct::link(nq,Link[nq]=Link[q]);
lct::cut(q);
lct::link(np,Link[np]=nq);
lct::link(q,Link[q]=nq);
while(p&&son[p][x]==q)son[p][x]=nq,p=Link[p];
}
inline void init(){scanf("%s",s+1);for(ri i=1,up=strlen(s+1);i<=up;++i)insert(s[i]-'A');}
inline void add(){gets(Mask);for(ri i=0,up=str.size();i<up;++i)insert(str[i]-'A');}
inline int query(){
gets(Mask);
int p=1;
for(ri i=0,up=str.size();i<up;++i)if(!(p=son[p][str[i]-'A']))return 0;
return lct::splay(p),lct::siz[p];
}
}
int main(){
scanf("%d",&n),sam::init();
while(n--){
char op[6];
scanf("%s",op);
if(op[0]=='A')sam::add();
else{
int ret=sam::query();
Mask^=ret,cout<<ret<<'\n';
}
}
}
2019.03.01 bzoj2555: SubString(sam+lct)的更多相关文章
- 【BZOJ 2555】 2555: SubString (SAM+LCT)
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2548 Solved: 762 Description 懒得写背景了 ...
- bzoj 2555 SubString(SAM+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...
- 【SPOJ】Longest Common Substring(后缀自动机)
[SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...
- 2019浙师大校赛(浙大命题)(upc复现赛)总结
2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...
- BZOJ2555: SubString(后缀自动机,LCT维护Parent树)
Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...
- BZOJ2555 SubString【SAM + Link Cut Tree】
BZOJ2555. SubString 要求在线询问一个串在原串中出现的次数,并且可以在原串末尾添加字符串 如果没有修改的话,考虑建出\(parent\)树之后统计每个\(endpos\)节点的\(r ...
- BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- 2019的hdu暑假作业(欢迎纠错)
1219 遍历计数. #include<bits/stdc++.h> #define QAQ 0 using namespace std; ]; ]; int main(){ )){ me ...
- it's over | 2019 CSP-S 第二轮认证(超长预警)
也许应该从Day -1(2019年11月14日周四)开始说起? 卑微的我们在学长的怂恿下终于...停课了(哇我们太菜了,只停一天半的课有个卵用 早读后我带头去办公室请假,飞哥很大方地答应了,同时免了我 ...
随机推荐
- 涂抹mysql笔记-数据备份和恢复
<>物理备份和逻辑备份<>联机备份和脱机备份<>本地备份和远程备份<>完整备份和增量备份<>完整恢复和增量恢复<>复制表相关文件 ...
- 第三章 FFmpeg转封装
3.1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件. 3.1.1 MP4格式标准介绍 MP4文件由多个Box与FullBox组成 每个Box由Header和Data两部 ...
- oracle12c安装[INS-30131]异常
接昨天写到的oracle12c安装异常解决办法. 解决这个问题百度到两种解决办法: 方法一 1.1.检查开启服务 控制面板 → 管理工具 → 服务 找到TCP/IP 和 Server 状态调为“启动” ...
- Java应用常用性能分析工具
Java应用常用性能分析工具 好的工具有能有效改善和提高工作效率或加速分析问题的进度,笔者将从事Java工作中常用的性能工具和大家分享下,如果感觉有用记得投一票哦,如果你有好的工具也可以分享给我 工具 ...
- 作着玩:登录页(纯css,不支持ie9以下)
支持chrome FireFox 和 IE10+,(IE9也能显示,IE9以下不支持) <style type="text/css"> body{position:re ...
- Android下的几种时间格式转换
更多更全的工具类,请参考github上的Blankj/AndroidUtilCode 将毫秒转换为小时:分钟:秒格式 public static String ms2HMS(int _ms){ Str ...
- RedHat 7.0更新升级openSSH7.4p1
由于目前服务器上ssh版本较低,存在安全漏洞,需要升级到最新版本. 系统版本:RedHat 7.0 旧openSSH版本:6.4p1 新openSSH版本:7.4p1 升级方式:源码安装 安装操作步骤 ...
- canvas 2.0 图片绘制
绘制图片drawImage 2013.02.21 by 十年灯·一条评论 本文属于<html5 Canvas画图系列教程> 这里的绘制图片是指把一张现成的图片,绘制到Canvas上面. 有 ...
- Centos7搭建OpenVPN服务器
Windows下同时连接多个VPN的话,需要以管理员身份运行 C:\Program Files\TAP-Windows\bin\addtap.bat 添加虚拟网络适配器 --------------- ...
- html语义化练习易牛课堂代码
html <body> <header> <!-- 导航 --> <nav> <a href=" ...