「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 ...
随机推荐
- cf 1263
A #include<bits/stdc++.h> using namespace std; int main(){ int t;cin>>t; while(t--){ ]; ...
- 前端每日实战:19# 视频演示如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教程 此视频 ...
- 如果你突然被裁员了,你的Plan B是什么?
保持学习的状态 很多人在30岁之前,或者说成家之前都还挺努力的,但之后就会懈怠.长期下去会让自己的退路变得越来越少.年龄大了学东西不比以前快,体力也不比以前好,仅仅维持现状都需要付出很多努力,所以这个 ...
- css缓存问题
频繁更换样式,会导致样式缓存, 在实际项目开发过过程中,页面是上传到服务器上的.而为了减少服务器的压力,让用户少加载,浏览器会将图片.css.js缓存到本地中,以便下次访问网站时使用.这样做不仅减少了 ...
- 判断是否是NaN
if (isNaN(parseInt(x))) { alert("非数字"); } else{ alert("数字"); }
- 数据库——MySQL乐观锁与悲观锁
乐观锁与悲观锁 一.悲观锁 悲观锁的特点是“先获取锁,再进行业务操作“”.即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作 读取某几行数据时会给他们加上锁,其他的要修改数 ...
- Oralce分页
SELECT *FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( SELECT A . ID AS "id", A .bill_noti ...
- Linux查看软件安装路径,和文件的位置
查看软件是否安装:rpm -qa|grep xx 列出软件安装包安装的文件:rpm -ql 直接使用rpm -qal |grep mysql 查看mysql所有安装包的文件存储位置 通过find去查找 ...
- docker--container
[root@localhost docker_test]# docker run bigni/test3 #运行 docker so easy ! [root@localhost docker_tes ...
- FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012951123/article/details/36871955 <span style= ...