询问相当于要求长度为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 }

[bzoj4943]蚯蚓排队的更多相关文章

  1. 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)

    [BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...

  2. 【NOI】2017 蚯蚓排队(BZOJ 4943,LOJ 2303) 模拟+hash

    [题目]#2303. 「NOI2017」蚯蚓排队 [题意]给定n条长度不超过6的蚯蚓,初始各自在一个队伍.m次操作:1.将i号蚯蚓和j号蚯蚓的队伍合并(保证i为队尾,j为队首).2.将i号蚯蚓和它后面 ...

  3. LOJ2303 「NOI2017」蚯蚓排队

    「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...

  4. 「NOI2017」蚯蚓排队 解题报告

    「NOI2017」蚯蚓排队 这题真的草 你考虑\(k\)这么小,每次合并两个串,增加的有用串的数量是\(O(k^2)\)的,暴力加入这些串,求一下这些串的Hash值,塞到Hash表里面去 这里采用类似 ...

  5. BZOJ4943 NOI2017蚯蚓排队(哈希+链表)

    能看懂题就能想到正解.维护所有长度不超过k的数字串的哈希值即可,用链表维护一下蚯蚓间连接情况.由于这样的数字串至多只有nk个,计算哈希值的总复杂度为O(nk),而分裂的复杂度为O(ck^2),询问复杂 ...

  6. BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...

  7. 【uoj#315/bzoj4943】[NOI2017]蚯蚓排队 Hash

    题目描述 给出 $n$ 个字符,初始每个字符单独成字符串.支持 $m$ 次操作,每次为一下三种之一: $1\ i\ j$ :将以 $i$ 结尾的串和以 $j$ 开头的串连到一起. $2\ i$ :将 ...

  8. bzoj4943 [Noi2017]蚯蚓排队

    题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...

  9. [NOI 2017]蚯蚓排队

    Description 题库链接 蚯蚓幼儿园有 \(n\) 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从 \(1\) 到 \(n\) 的连续正整数编号.每只蚯蚓的长度 ...

随机推荐

  1. Git学习笔记03-原理

    在Git中,算上远程Git仓库有四个工作区域 Git本地有三个区域(工作区域.暂存区,资源区,远程Git仓库) 工作区域:就是你本机写好的代码,你可以看到的 暂存区:你写好的代码上传后被git管理的内 ...

  2. 题解 「SDOI2017」硬币游戏

    题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...

  3. 洛谷4103 HEOI2014大工程(虚树+dp)

    又是一道虚树好题啊 我们建出来虚树,然后考虑dp过程,我们分别令\(sum[x],mndis[x],mxdis[x],size[x]\)为子树内的路径长度和,最短链,最长链,子树内关键点个数. 对于一 ...

  4. 分布式应用开发 | SpringBoot+dubbo+zookeeper实现服务注册发现 | 远程服务调用

    前言 通过新建两个独立服务--提供者.消费者,模拟两个独立分布的应用,通过使用dubbo+zookeeper来实现远程服务调用. 目录 项目搭建 provider-server consumer-se ...

  5. 超详细的Ribbon源码解析

    Ribbon简介 什么是Ribbon? Ribbon是springcloud下的客户端负载均衡器,消费者在通过服务别名调用服务时,需要通过Ribbon做负载均衡获取实际的服务调用地址,然后通过http ...

  6. PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)

    1086 就不告诉你 (15分) 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三."本题就要求你,对任何一对给定的 ...

  7. netty系列之:使用netty实现支持http2的服务器

    目录 简介 基本流程 CleartextHttp2ServerUpgradeHandler Http2ConnectionHandler 总结 简介 上一篇文章中,我们提到了如何在netty中配置TL ...

  8. Java:Iterator接口与fail-fast小记

    Java:Iterator接口与fail-fast小记 对 Java 中的 Iterator接口 和 fail-fast,做一个微不足道的小小小小记 Iterator Iterator接口 Itera ...

  9. PCB设计中新手和老手都适用的七个基本技巧和策略

    本文将讨论新手和老手都适用的七个基本(而且重要的)技巧和策略.只要在设计过程中对这些技巧多加注意,就能减少设计回炉次数.设计时间和总体诊断难点. 技巧一:注重研究制造方法和代工厂化学处理过程 在这个无 ...

  10. 嵌入式物联网之SPI接口原理与配置

    本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...