询问相当于要求长度为k的公共子串个数,很容易联想到hash,由于询问是对全局的,因此对全局开一个hash的桶
对于合并/删除操作,将中间新产生/需要删除的字符串暴力修改即可,单次复杂度最坏为$o(k^{2})$
这样看上去复杂度是$o(nk^{2})$的,但考虑最终的字符串总数$o(nk)$,删除操作最多删掉$o(ck^{2})$,而$\sum 合并复杂度-\sum 删除复杂度=o(nk)$,因此合并复杂度均摊仅为$o(nk)$
但这样的字符串个数挺多的,那么模数就要比较大,而且还不能用map(会TLE),可以再对结果取模然后挂链即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define K 50
5 #define P 4999999
6 #define mod 998244353
7 #define ll unsigned long long
8 struct ji{
9 int nex,tot;
10 ll val;
11 }edge[N*100];
12 int E,n,m,p,x,y,f[K<<2],a[N],pre[N],nex[N],head[P+100];
13 char s[N*50];
14 void add(ll x,int y){
15 int z=x%P;
16 for(int i=head[z];i!=-1;i=edge[i].nex)
17 if (edge[i].val==x){
18 edge[i].tot+=y;
19 return;
20 }
21 edge[E].nex=head[z];
22 edge[E].val=x;
23 edge[E].tot=y;
24 head[z]=E++;
25 }
26 int query(ll x){
27 int y=x%P;
28 for(int i=head[y];i!=-1;i=edge[i].nex)
29 if (edge[i].val==x)return edge[i].tot;
30 return 0;
31 }
32 void update(int x,int y,int p){
33 int l=K,r=K+1;
34 for(int i=x;(i)&&(l);i=pre[i],l--)f[l]=a[i];
35 for(int i=y;(i)&&(r<=K*2);i=nex[i],r++)f[r]=a[i];
36 l++;
37 r--;
38 for(int i=K;i>=l;i--){
39 ll hash=0;
40 for(int j=i;j<=K;j++)hash=hash*11+f[j];
41 for(int j=K+1;j<=min(r,i+K-1);j++){
42 hash=hash*11+f[j];
43 add(hash,p);
44 }
45 }
46 if (p<0)nex[x]=pre[y]=0;
47 else{
48 nex[x]=y;
49 pre[y]=x;
50 }
51 }
52 int main(){
53 scanf("%d%d",&n,&m);
54 memset(head,-1,sizeof(head));
55 for(int i=1;i<=n;i++){
56 scanf("%d",&a[i]);
57 add(a[i],1);
58 }
59 for(int i=1;i<=m;i++){
60 scanf("%d",&p);
61 if (p==1){
62 scanf("%d%d",&x,&y);
63 update(x,y,1);
64 }
65 if (p==2){
66 scanf("%d",&x);
67 y=nex[x];
68 update(x,y,-1);
69 }
70 if (p==3){
71 scanf("%s%d",s,&x);
72 y=strlen(s);
73 ll mi=1,hash=0;
74 for(int j=0;j<x;j++){
75 mi=mi*11;
76 hash=hash*11+s[j]-'0';
77 }
78 int ans=query(hash);
79 for(int j=x;j<y;j++){
80 hash=hash*11+s[j]-'0'-(s[j-x]-'0')*mi;
81 ans=1LL*ans*query(hash)%mod;
82 }
83 printf("%d\n",ans);
84 }
85 }
86 }

最新文章

  1. Linux:常用命令
  2. c#去除List中的重复项
  3. PHP配置限制文件大小上传
  4. 转载:bootstrap, boosting, bagging 几种方法的联系
  5. [题解]noip2016普及组题解和心得
  6. jquery.css 最简单的用法
  7. 1.7.4.1 Function Queries-函数查询
  8. JMX示例
  9. Fiddler工具
  10. yum安装CDH5.5 Hadoop集群
  11. App 组件化/模块化之路——构建开发架构思路
  12. MySQL主从失败 错误Got fatal error 1236解决方法
  13. HTML5对音视频的处理
  14. Java中的集合框架(上)
  15. [物理学与PDEs]第5章习题4 广义 Hookean 定律的张量的对称性
  16. 17秋 软件工程 团队第五次作业 Alpha
  17. P2292 [HNOI2004]L语言
  18. Android学习之基础知识四-Activity活动2讲
  19. hive 修复元数据命令 &amp; 如何快速复制一张hive的分区表
  20. tomcat 下配置 可 调试

热门文章

  1. CF280C Game on tree(期望dp)
  2. 讲讲java中线程池的实现
  3. 如何正确使用JMeter性能测试?紧扣面试实际要求
  4. 前端面试题之手写promise
  5. WeakMap与Map,使用WeakMap实现深拷贝循环引用问题
  6. 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)
  7. java性能优化常用工具jps、jstat、jinfo
  8. centos7 永久修改hostname
  9. hash 哈希表 缓存表
  10. CentOS7 安装oracle 11g (11.2.0.1.0)