「NOI2017」蚯蚓排队

题目描述

蚯蚓幼儿园有$n$只蚯蚓。幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演。

所有蚯蚓用从$1$到$n$的连续正整数编号。每只蚯蚓的长度可以用一个正整数表示,根据入园要求,所有蚯蚓的长度都不超过$6$。神刀手希望这些蚯蚓排成若干个队伍,初始时,每只蚯蚓各自排成一个仅有一只蚯蚓的队伍,该蚯蚓既在队首,也在队尾。

神刀手将会依次进行$m$次操作,每个操作都是以下三种操作中的一种:

  1. 给出$i$和$j$,令$i$号蚯蚓与$j$号蚯蚓所在的两个队伍合并为一个队伍,具体来说,令$j$号蚯蚓紧挨在$i$号蚯蚓之后,其余蚯蚓保持队伍的前后关系不变。

  2. 给出$i$,令$i$号蚯蚓与紧挨其后的一只蚯蚓分离为两个队伍,具体来说,在分离之后,$i$号蚯蚓在其中一个队伍的队尾,原本紧挨其后的那一只蚯蚓在另一个队伍的队首,其余蚯蚓保持队伍的前后关系不变。

  3. 给出一个正整数$k$和一个长度至少为$k$的数字串$s$,对于$s$的每个长度为$k$的连续子串$t$(这样的子串共有$|s| - k + 1$ 个,其中$|s|$为$s$的长度),定义函数$f(t)$,询问所有这些$f(t)$的乘积对$998244353$取模后的结果。其中$f(t)$的定义如下:
    对于当前的蚯蚓队伍,定义某个蚯蚓的向后$k$数字串为:从该蚯蚓出发,沿队伍的向后方向,寻找最近的$k$只蚯蚓(包括其自身),将这些蚯蚓的长度视作字符连接而成的数字串;如果这样找到的蚯蚓不足$k$只,则其没有向后$k$数字串。例如蚯蚓的队伍为$10$号蚯蚓在队首,其后是$22$号蚯蚓,其后是$3$号蚯蚓(为队尾),这些蚯蚓的长度分别为$4$、$5$、$6$,则$10$号蚯蚓的向后$3$数字串456,$22$号蚯蚓没有向后$3$数字串,但其向后$2$数字串56,其向后$1$数字串5

而$f(t)$表示所有蚯蚓中,向后$k$数字串恰好为$t$的蚯蚓只数。

输入输出格式

输入格式:

输入文件的第一行有两个正整数$n,m$ ,分别表示蚯蚓的只数与操作次数。

第二行包含$n$个不超过$6$的正整数,依次表示编号为$1, 2, \dots , n$的蚯蚓的长度。

接下来$m$行,每行表示一个操作。每个操作的格式可以为:

  • 1 i j $(1 \leqslant i, j \leqslant n)$表示:令$i$号与$j$号蚯蚓所在的两个队伍合并为一个队伍,新队伍中,$j$号蚯蚓紧挨在$i$号蚯蚓之后。保证在此操作之前,$i$ 号蚯蚓在某个队伍的队尾,$j$号蚯蚓在某个队伍的队首,且两只蚯蚓不在同一个队伍中。

  • 2 i $(1 \leqslant i \leqslant n)$表示:令$i$号蚯蚓与紧挨其后一个蚯蚓分离为两个队伍。保证在此操作之前,$i$号蚯蚓不是某个队伍的队尾。

  • 3 s k ($k$为正整数,$s$为一个长度至少为$k$的数字串)表示:询问$s$的每个长度为$k$的子串$t$的$f(t)$的乘积,对$998244353$取模的结果。$f(t)$的定义见题目描述。

同一行输入的相邻两个元素之间,用恰好一个空格隔开。

输入文件可能较大,请不要使用过于缓慢的读入方式。

输出格式:

依次对于每个形如3 s k的操作,输出一行,仅包含一个整数,表示询问的结果。

输入输出样例

输入样例#1:
复制

5 9
3 1 3 5 3
3 333135 2
3 333135 1
1 1 3
1 2 5
1 3 2
1 5 4
3 333135 2
3 333135 1
3 333135 3
输出样例#1:
复制

0
81
1
81
0
输入样例#2:
复制

2 10
6 6
3 666666 1
1 1 2
3 666666 2
3 666666 4
3 666666666666666666666666666666 1
2 1
1 2 1
3 666666 2
3 666666 4
3 666666666666666666666666666666 1
输出样例#2:
复制

64
1
0
75497471
1
0
75497471

说明

【子任务】

保证$n \leqslant 2 \times 10^5,\ m \leqslant 5 \times 10^5,\ k \leqslant 50$。

设$\Sigma |S|$为某个输入文件中所有询问的 s 的长度总和,则$\Sigma |S| \leqslant 10^7$。
设$c$为某个输入文件中形如2 i的操作的次数,则$c \leqslant 10^3$ 。

每个测试点的详细信息见下表:

题解

\(k\le 50\),那么变动的量也很少,直接用hash表维护长度和字符串hash值就行了。

至于蚯蚓,使用链表维护即可。

我不开O2就TLE最后一个点,2015ms。毒瘤出题人卡常数。

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef unsigned long long ull; co int MAX=222222,MOD=998244353,base=233;
char ch[10000010];
ull pw[MAX];
int next[MAX],last[MAX],a[MAX];
int n,m;
co int mod=19260817;
struct Hash_Table{
int h[mod],cnt;
struct Line{int len,next,w;ull s;}e[10000000];
void add(int len,ull s,int w){
for(rg int i=h[s%mod];i;i=e[i].next)
if(e[i].len==len&&e[i].s==s)
return (e[i].w+=w)%=MOD,void();
e[++cnt]=(Line){len,h[s%mod],w,s},h[s%mod]=cnt;
}
int query(int len,ull s){
for(rg int i=h[s%mod];i;i=e[i].next)
if(e[i].len==len&&e[i].s==s) return e[i].w;
return 0;
}
}hash;
void link(int x,int y){
next[x]=y,last[y]=x;
ull sx=0;
for(int i=x,lx=1;i&&lx<=49;i=last[i],++lx){
sx+=a[i]*pw[lx-1];
ull sy=sx;
for(int j=y,ly=lx+1;j&&ly<=50;j=next[j],++ly) sy=sy*base+a[j],hash.add(ly,sy,1);
}
}
void cut(int x){
int y=next[x];
ull sx=0;
for(rg int i=x,lx=1;i&&lx<=49;i=last[i],++lx){
sx+=a[i]*pw[lx-1];
ull sy=sx;
for(rg int j=y,ly=lx+1;j&&ly<=50;j=next[j],++ly) sy=sy*base+a[j],hash.add(ly,sy,MOD-1);
}
next[x]=last[y]=0;
}
int query(int len){
int l=strlen(ch+1),ans=1;
ull s=0;
for(rg int i=1;i<len;++i) s=s*base+ch[i]-'0';
ch[0]='0';
for(rg int i=len;i<=l;++i){
s=s*base+ch[i]-'0'-pw[len]*(ch[i-len]-'0');
ans=1LL*ans*hash.query(len,s)%MOD;
}
return ans;
}
int main(){
std::ios::sync_with_stdio(0);
pw[0]=1;for(rg int i=1;i<=50;++i) pw[i]=pw[i-1]*base;
read(n),read(m);
for(rg int i=1;i<=n;++i) hash.add(1,read(a[i]),1);
while(m--){
int opt=read<int>();
if(opt==1){
int x=read<int>(),y=read<int>();
link(x,y);
}
else if(opt==2) cut(read<int>());
else{
scanf("%s",ch+1);
printf("%d\n",query(read<int>()));
}
}
return 0;
}

LOJ2303 「NOI2017」蚯蚓排队的更多相关文章

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

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

  2. LOJ#2303. 「NOI2017」蚯蚓排队

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

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

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

  4. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

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

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

  6. 「NOI2017」游戏

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

  7. loj #2305. 「NOI2017」游戏

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

  8. LOJ2305 「NOI2017」游戏

    「NOI2017」游戏 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行$n$场 ...

  9. LibreOJ2302 - 「NOI2017」整数

    Portal Description 有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作: 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\( ...

随机推荐

  1. python is == 的区别, 编码与解码.深浅拷贝

    一. is  ==  的区别 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址 is 比较的是地址 编码回顾 除了了ASCII码以外, 其他信息不能直接转换 编码和解码的时 ...

  2. 如何实现模拟器(CHIP-8 interpreter) 绝佳杰作.

    转自 http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/ How to write an ...

  3. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its 错误解决办法

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary log ...

  4. React-Native 安装改变镜像

    3.安装完node后建议设置npm镜像以加速后面的过程,否则后面插件安装巨慢 npm config set registry https://registry.npm.taobao.org --glo ...

  5. Django APP之contenttypes简单应用

    Conttenttypes介绍 当你看到contenttype你是不是想到了请求头的contenttype? 但是 此contenttypes不是请求头Content-Type而是Django自带的a ...

  6. java使用poi读写Excel

    package com.demo.excel; import com.demo.pojo.Student; import org.apache.poi.hssf.usermodel.HSSFCell; ...

  7. CentOS 7 巨大变动之 systemd 取代 SysV的Init

    1 systemd是什么 首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序.   ...

  8. 【HTTP】HTPP学习笔记

    1.了解web及网络基础 HTTP的诞生 TCP/IP协议族 应用层 FTP文件传输协议 HTTP超文本传输协议 DNS域名系统:IP地址<--->域名 传输层 TCP传输控制协议 三次握 ...

  9. 中国移动OneNet平台上传GPS数据JSON格式

    最终目的输出 POST /devices/3225187/datapoints HTTP/1.1 api-key: R9xO5NZm6oVI4YBHvCPKEqtwYtMA Host: api.hec ...

  10. 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

    Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...