$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面;让一队蚯蚓从某个蚯蚓后面断成两队;问:给个字符串,问他的。。算了你们直接看题吧

这什么沙雕题QAQ

所有询问的串只有$nk$种,把他们全丢进hash里面就好了。。注意双hash,一个用来当链表一个用来在链表里判重。

复杂度的话,只考虑合并是$nk$的(相当于把所有串算一次),而拆分是$ck^2$的,拆对合并的复杂度影响是跟拆本身复杂度一样的。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
//#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m;
#define maxn 200011
#define maxh 1000007
int a[maxn],bb[]; LL cc[]; struct Hash
{
struct Edge{LL to; int v,next;}edge[maxn*]; int first[maxh],le;
Hash() {le=;}
void in(LL x,int h,int v)
{
for (int i=first[h];i;i=edge[i].next)
{
Edge &e=edge[i];
if (e.to==x) {e.v+=v; return;}
}
Edge &e=edge[le]; e.to=x; e.v=; e.next=first[h]; first[h]=le++;
}
int find(LL x,int h)
{
for (int i=first[h];i;i=edge[i].next)
{
Edge &e=edge[i];
if (e.to==x) return e.v;
}
return ;
}
}h; int Nxt[maxn],Pre[maxn];
char s[maxn*]; int len;
int main()
{
bb[]=; for (int i=;i<=;i++) bb[i]=bb[i-]*%maxh;
cc[]=; for (int i=;i<=;i++) cc[i]=cc[i-]*;
n=qread(); m=qread();
for (int i=;i<=n;i++) {Pre[i]=Nxt[i]=; a[i]=qread(); h.in(a[i],a[i],);}
int op; char c; int x,y;
while (m--)
{
op=qread();
if (op==)
{
x=qread(); y=qread();
Nxt[x]=y; Pre[y]=x;
LL B=,C=;
for (int i=x,cnt=,w=;cnt && i;i=Pre[i],w++,cnt--)
{
B=(B+1ll*a[i]*bb[w])%maxh;
C=C+1ll*a[i]*cc[w];
LL nb=B,nc=C;
for (int j=y,k=;j && k<=cnt;j=Nxt[j],k++)
{
nb=(nb*+a[j])%maxh;
nc=nc*+a[j];
h.in(nc,nb,);
}
}
}
else if (op==)
{
x=qread(); y=Nxt[x];
Nxt[x]=; Pre[y]=;
LL B=,C=;
for (int i=x,cnt=,w=;cnt && i;i=Pre[i],w++,cnt--)
{
B=(B+1ll*a[i]*bb[w])%maxh;
C=C+1ll*a[i]*cc[w];
LL nb=B,nc=C;
for (int j=y,k=;j && k<=cnt;j=Nxt[j],k++)
{
nb=(nb*+a[j])%maxh;
nc=nc*+a[j];
h.in(nc,nb,-);
}
}
}
else if (op==)
{
len=;
while ((c=getchar())<'' || c>'');
do s[++len]=c; while ((c=getchar())>='' && c<='');
x=qread();
LL B=,C=;
for (int i=;i<x;i++) B=(B*+s[i]-'')%maxh,C=C*+s[i]-'';
int ans=;
for (int i=x;i<=len;i++)
{
B=(B*+s[i]-'')%maxh; C=C*+s[i]-'';
ans=1ll*ans*h.find(C,B)%;
B=(B-(s[i-x+]-'')*bb[x-])%maxh+maxh; B%=maxh;
C=C-(s[i-x+]-'')*cc[x-];
}
printf("%d\n",ans);
}
}
return ;
}

LOJ#2303. 「NOI2017」蚯蚓排队的更多相关文章

  1. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  2. LOJ2303 「NOI2017」蚯蚓排队

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

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

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

  4. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  5. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  6. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  7. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

  8. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

  9. LOJ#2307. 「NOI2017」分身术

    $n \leq 100000$个点,$m \leq 100000$次询问,每次问删掉一些点后的凸包面积. 不会啦写个20暴力,其实是可以写到50的.当个计算几何板子练习. //#include< ...

随机推荐

  1. 关于flyme5显示不到和卸载不到旧应用解决方法

    笔者买入一台mx5,升级flyme5后旧应用没有显示出来,而且在设置的应用管理都没显示旧应用. 通过adb命令: adb shell pm list packages显示所有包名, 查看自己要删除应用 ...

  2. TCP/UDP 协议介绍

    TCP/IP五层网络结构模型 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输.只有该层为真实物理通信,其它各层为虚拟通信 数据 ...

  3. 【转】VC自定义消息

    MFC一般可利用ClassWizard类向导添加消息和消息处理函数,但用户自定义消息必须手工输入,现将vc自定义消息方法步骤记录如下: (1)定义消息 利用#define语句直接定义用户自己的消息(既 ...

  4. PostgreSQL学习(1)-- 安装pageinspect extension

    1.源码编译 pageinspect的源码在postgre源码包的contrib目录下,解压postgre源码包后进入对应的目录. [root@localhost pageinspect]# pwd ...

  5. Python入门:Python基础笔记

    (C语言:)C语言是相对C++.C#.Java等语言更接近底层,并且一些硬件编程都可以使(只能使用)C语言.另外C语言学起来相对困难,因为涉及到指针,指针也是语言接近底层语言的一个特征.目前编写较大的 ...

  6. python并发编程之进程1(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  7. 20181210(os,os.path,subprocess,configparser,shutil)

    1.os模块 os表示操作系统,该模块主要处理与操作系统相关的操作.最常用的是文件操作:打开,读取,删除,复制,重命名. 重点掌握增删改查的函数操作. import os# 获取当前执行文件所在文件夹 ...

  8. Shell脚本完成hadoop的集群安装

    虽然整体实现的自动安装,但还是有很多需要完善的地方,比如说: 1. 代码目前只能在root权限下运行,否则会出错,这方面需要加权限判断: 2.另外可以增加几个函数,减少代码冗余: 3.还有一些判断不够 ...

  9. SSAS——MDX基础

    一.基本概念 MDX:一种查询语言,从多维的数据集单元格中检索数据.支持两种不同的模式: 1.表达式语言:定义和操纵Analysis Services对象和数据以计算值 2.查询语言:从Analysi ...

  10. python单例模式的几种实现方法

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...