传送门
题意简述:
要求在线支持两个操作
(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';}}
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10582388.html

2019.03.01 bzoj2555: SubString(sam+lct)相关推荐

  1. 【OpenCV 例程200篇】03. 图像的显示(cv2.imshow)

    [OpenCV 例程200篇]03. 图像的显示(cv2.imshow) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新 ...

  2. 2022.03全国青少年软件编程(图形化)等级考试试卷(三级)

    2022.03全国青少年软件编程(图形化)等级考试试卷(三级) 更多内容请查看网站: http://www.wancode.net 历年真题模拟题实时更新

  3. 2022.03全国青少年软件编程(图形化)等级考试试卷(二级)

    2022.03全国青少年软件编程(图形化)等级考试试卷(二级) 更多内容请查看网站: http://www.wancode.net 历年真题模拟题实时更新

  4. 2022.03全国青少年软件编程(图形化)等级考试试卷(四级)

    2022.03全国青少年软件编程(图形化)等级考试试卷(四级) 更多内容请查看网站: http://www.wancode.net 历年真题模拟题实时更新

  5. 2019秒下款的口子(12月)

    2019秒下款的口子(12月) 网贷一定要选好平台,拒绝"714",以下是小编整理的今年12月份网贷口子,全都是精心挑选,救命良药. MY钱包 MY钱包上线也有段时间的口子了,下款 ...

  6. 吉林大学超星慕课平台——高级语言程序设计 实验01 顺序程序设计(2022级)

    实验01 顺序程序设计(2022级) 1. (程序题) 表达式计算. 问题描述:编写程序,计算并输出如下表达式的值: y= 其中a,x,y均为float类型,取值为3.1415926.输出结果要求保留 ...

  7. Catlike Coding翻译——Movement 01移动球体(玩家控制)

    原文链接 在平面上放置一个带有拖尾的球体 根据玩家输入移动球体 控制速度和加速度 限制球体位置以及让他从边缘弹开 这是关于控制角色移动的系列教程的第一部分.具体来说,我们将根据玩家输入来移动一个球体. ...

  8. HDU4825 Xor Sum 01字典树(Tire Tree)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  9. 2019 ICPC Asia Yinchuan Regional(9 / 13)

    2019 ICPC Asia Yinchuan Regional A - Girls Band Party(分组背包) 每个物品有两个标签,名字,颜色,当名字是设置为奖赏时会对整体加上0.1 的贡献, ...

最新文章

  1. TensorFlow教程之完整教程 2.7 字词的向量表示
  2. python 动态类型检测 性能_4种速度最慢的动态编程语言,你一定用过
  3. 用户操作-登录代码实现
  4. ng-template和对应生成的注释
  5. .so文件反编译_java加密防止反编译-VirboxProtector
  6. 分布式日志收集系统Apache Flume的设计详细介绍
  7. 玩,玩什么,怎么玩?
  8. python基础教程是什么-Python基础教程(一)
  9. 浅评-我所用的输入法
  10. C语言 学生课程成绩管理系统
  11. SAS安装及过程中遇到的问题的解决办法
  12. 【bootcamp问答系统部署】
  13. 【大学物理·静止电荷的电场】静电场的能量
  14. Unity2019版本打包一直停留在 detecting current sdk tools version的解决方案
  15. 微信小程序——天气查询
  16. 5位专家、24个观点,教你如何进入数据快车道
  17. 搭建帮助中心无方法,Baklib帮你轻松解决
  18. 【AI简报20210702期】骁龙888 plus发布、RISC-V处理器大飞跃
  19. 穷爸爸与富爸爸读后感 (1)
  20. 编程经验NO.1 from月光博客

热门文章

  1. System.Data.SqlClient.SqlException:“ ',' 附近有语法错误。必须声明标量变量 @Password。”
  2. 【C#】数组的最大最小值
  3. python实现glove,gensim.word2vec模型训练实例
  4. Google Colab——用谷歌免费GPU跑你的深度学习代码
  5. TensorFlow+TVM优化NMT神经机器翻译
  6. 如何写新的C++ OP
  7. 代码生成codegen
  8. Fragment之间传递数据的方式
  9. 2021年大数据Hadoop(十四):HDFS的高可用机制
  10. 2021年大数据Spark(十三):Spark Core的RDD创建