「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」蚯蚓排队 解题报告的更多相关文章

  1. LOJ2303 「NOI2017」蚯蚓排队

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

  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. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  5. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  6. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  7. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

  8. 「SCOI2015」国旗计划 解题报告

    「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...

  9. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

随机推荐

  1. Dataphin数据服务系列之--API 配置、管理和消费

    研发小哥哥还在为公司里大量 API 只上不下,不可查不可用, 想找的 API 找不到而苦恼吗?业务方小姐姐还在为 API 开发时间长,业务相应不及时而抱怨吐槽吗? 铛铛铛,Dataphin 数据服务 ...

  2. c# 如何获取系统管理员权限(UAC) 及判断当前是否是管理员权限

    环境说明: VS2012,windows 7  亲自验证过win7 和xp ,XP直接不弹框,因为XP没有UAC控制机制 步骤1: 右键项目-->属性-->安全性-->选中[启用Cl ...

  3. 安装并配置前端自动化工具-gulp

    由于现在前端自动化已经很有必要了,所以我今天死皮烂脸的找了2位前端大咖帮助我安装和配置gulp,讲真,这一步步弄下来直到安装配置成功,到现在还是迷迷糊糊,不过我还是把这些步骤给记录下来,以防下次不记得 ...

  4. Python读取文件时出现UnicodeDecodeError 'gbk' codec can't decode byte 0x80 in position x

    Python在读取文件时 with open('article.txt') as f: # 打开新的文本 text_new = f.read() # 读取文本数据出现错误: UnicodeDecode ...

  5. 启动Nginx、查看nginx进程、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

    1.启动nginx的方式: cd /usr/local/nginx ls

  6. Golang操作MySQL的正确姿势

    封装原因: 查看了很多网上提供的ORM类型的数据库操作,觉得比较麻烦,需要提前配置很多的表结构体,然后才能使用,对于数据表很多的项目就配置起来就比较麻烦,所以对golang的mysql包进行了外层包装 ...

  7. 【SpringBoot】 理解Spirng中的IOC原理

    前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC ...

  8. 基于windows下,node.js之npm

    1.下载node.js一路安装下去 在开始 node文件夹下,打开cmd 2.创建一个开发目录 mkdir reactQa && cd reactQa 3.初始化一个nmp的开发环境 ...

  9. Nginx负载均衡之TCP/UDP流

    负载均衡是指在多个后端服务器之间有效地分配网络流量. 从NGINX Plus R5[1] 版本开始可以代理和负载均衡传输控制协议(Transmission Control Protocol,TCP)通 ...

  10. appium常见问题03_appium脚本报错selenium.common.exceptions.WebDriverException

    运行appium脚本时报错selenium.common.exceptions.WebDriverException...,如下截图: 该报错说明appium和app的内置chrome版本不一致 [解 ...