「NOI2017」蚯蚓排队 解题报告
「NOI2017」蚯蚓排队
这题真的草
你考虑\(k\)这么小,每次合并两个串,增加的有用串的数量是\(O(k^2)\)的,暴力加入这些串,求一下这些串的Hash值,塞到Hash表里面去
这里采用类似双hash的方法,一个表进行拉表,另一个表存这个串的权值
然后就是暴力搞了
犯了个很sb的错误,我把每个蚯蚓长度都-1了,这样很容易爆Hash
不过我最开始是对每个长度的串开一个Hash数组搞,这样空间大,时间常数大,卡不过去,但不会因为长度为0的情况爆hash
最后回来的时候,一直爆Hash到自闭了...
Code:
//#pragma GCC optimize("Ofast")
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define ll long long
#define ull unsigned long long
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
//#define gc() getchar()
template <class T>
void read(T &x)
{
int f=0;x=0;char c=gc();
while(!isdigit(c)) f|=c=='-',c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
if(f) x=-x;
}
void reads(int *s)
{
char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) s[++s[0]]=c-'0',c=gc();
}
const int N=300010;
const int mod=19491001;
struct Hash
{
int head[mod],Next[N*50],siz[N*50],cnt;
ull idx[N*50];
void ins(int x,ull id)
{
for(int i=head[x];i;i=Next[i])
if(id==idx[i])
{
++siz[i];
return;
}
Next[++cnt]=head[x],head[x]=cnt;
siz[cnt]=1;
idx[cnt]=id;
}
void era(int x,ull id)
{
for(int i=head[x];i;i=Next[i])
if(id==idx[i])
{
--siz[i];
return;
}
puts("err");
}
int qry(int x,ull id)
{
for(int i=head[x];i;i=Next[i])
if(id==idx[i])
return siz[i];
return 0;
}
}Ha;
const int bas=13131;
const int bas2=131;
int n,m,pre[N],suc[N],num[N],s[N];
int saki[233];
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++)
{
ull idx;
read(num[i]);
idx=num[i];
Ha.ins(num[i],idx);
}
for(int op,u,v,k,i=1;i<=m;i++)
{
read(op);
if(op==1)
{
read(u),read(v);
suc[u]=v,pre[v]=u;
int now=u,l=51,r=50;
while(now&&l)
{
saki[--l]=num[now];
now=pre[now];
}
now=v;
while(now&&r<=100)
{
saki[++r]=num[now];
now=suc[now];
}
for(int i=l;i<=50;i++)
{
ull idx=0;
int x=0;
for(int j=i;j<=i+49&&j<=r;j++)
{
x=(1ll*x*bas+saki[j])%mod;
idx=idx*bas2+saki[j];
if(j>50) Ha.ins(x,idx);
}
}
}
else if(op==2)
{
read(u),v=suc[u];
int now=u,l=51,r=50;
while(now&&l)
{
saki[--l]=num[now];
now=pre[now];
}
now=v;
while(now&&r<=100)
{
saki[++r]=num[now];
now=suc[now];
}
for(int i=l;i<=50;i++)
{
ull idx=0;
int x=0;
for(int j=i;j<=i+49&&j<=r;j++)
{
x=(1ll*x*bas+saki[j])%mod;
idx=idx*bas2+saki[j];
if(j>50) Ha.era(x,idx);
}
}
suc[u]=pre[v]=0;
}
else
{
int ans=1;
s[0]=0;
reads(s),read(k);
int po=1,x=0;ull ba=1,idx=0;
for(int i=1;i<k;i++) po=1ll*po*bas%mod,ba=ba*bas2;
for(int i=1;i<k;i++) idx=idx*bas2+s[i],x=(1ll*x*bas+s[i])%mod;
for(int i=k;i<=s[0];i++)
{
idx=idx*bas2+s[i],x=(1ll*x*bas+s[i])%mod;
ans=1ll*ans*Ha.qry(x,idx)%998244353;
if(!ans) break;
idx-=s[i-k+1]*ba;
x-=1ll*s[i-k+1]*po%mod;
if(x<0) x+=mod;
}
printf("%d\n",ans);
}
}
return 0;
}
2019.6.1
「NOI2017」蚯蚓排队 解题报告的更多相关文章
- LOJ2303 「NOI2017」蚯蚓排队
「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...
- LOJ#2303. 「NOI2017」蚯蚓排队
$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...
- LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表
题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
随机推荐
- ElasticSearch学习文档2018.11
1 Elasticsearch安装 1.1 ES6.0版本安装head插件 1.1 下载head插件 下载地址:https://github.com/mobz/elasticsear ...
- BZOJ 3294: [Cqoi2011]放棋子(计数dp)
传送门 解题思路 设\(f[i][j][k]\)表示前\(k\)个颜色的棋子占领了\(i\)行\(j\)列的方案数,那么转移时可以枚举上一个颜色时占领的位置,\(f[i][j][k]=\sum\lim ...
- js中Array方法重写(二):myForEach;myEvery;mySome;myFilter;myReduce
一.myForEach //myForeach 数组每个元素都执行一次回调函数 Array.prototype.myForEach = function(callback){ for(var i = ...
- 20175120彭宇辰 《Java程序设计》第十周学习总结
教材内容总结 十二章 Java多线程机制 一.进程与线程.操作系统与进程 -线程不是进程,是比进程更小的执行单位.但与进程不同的是,线程的中断和恢复可以更加节省系统的开销. -线程可以共享进程中的某些 ...
- hdu 5396 Expression
考虑到此题麻烦了某hust大神&体现出了自己数学能力的欠缺 虽然最近一直比较忙 还是把这题的题解写下来吧 首先看完数据范围后 应该有不少人会反应到是$n^3$的DP 以$F[i][j]$表示从 ...
- hive sql基础了解
会有些不一样 1 例如使用SQL 之前,要了解用了那个库,use jz_daojia 2 使用GET_JSON_OBJECT 函数等,以及参数 匹配 $.childBrithDay 挺有意思的.新玩意 ...
- 如何获得一个干净的 gnome 开发环境?
下载 stage3-amd64-systemd-xxxxxxxx.tar.bz2 eselect profile set default/linux/amd64/17.0/desktop/gnome/ ...
- 关于曲线 规划 算法 线性 S曲线 贝塞尔曲线
工控领域经常会涉及速度加减速的算法:线性加减速,S曲线加减速(sin函数,拓展其他三角函数曲线), 贝塞尔曲线,等等. 线性加减速: 设定起始速度V0,目标速度V1,加速时间Ta(s,或加速度) ...
- 精简Docker镜像的几个方法
一.使用更精简的镜像 常用的Linux系统镜像一般有 Debian.Ubuntu.CentOS和Alpine,其中Alpine是面向安全的轻量级Linux发行版本.Docker的Alpine镜像仅有不 ...
- Codeforces 1114C(数论)
题面 传送门 分析 我们先考虑n!在10进制下有多少个0 由于10=2*5, 我们考虑n!的分解式中5的指数,答案显然等于\(\frac{n}{5}+\frac{n}{5^2}+\frac{n}{5^ ...