「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. HTTP的FormData和Payload的传输格式

    FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-f ...

  2. js中的$符

    js中的$代表什么意思呢? 首先js的作用是什么呢?是修饰网页动态内容的.那么修饰就需要定位主题,比如你把html比喻一个美女,让她唱一首歌.那么首先你要定位出是你想让哪个美女唱歌,通常我们用id来定 ...

  3. Java学习之包

    一.包:就是类的命名空间(在文件系统中的表现形式就是文件夹) 二.代码编写规则 1.写在程序文件的第一行 2.格式:package 包名[.包名1.包名2......] 类的全名称 包名.类名 例如: ...

  4. WebForm 用户控件 委托 实现 textbox后台赋值 调用端处理实现 textchange

    新建一个简单的用户控件,如下图所示 textbox只读,button按钮模拟实现一堆业务逻辑后对textbox赋值. 用户控件后台代码也很简单 public partial class UTTCont ...

  5. C语言|博客作业12

    一.我学到的内容(整理本课程所学,[用思维导图的方式] 二.我的收获(包括我完成的所有作业的链接+收获)不能只有作业链接,没有收获 作业链接 收获 https://edu.cnblogs.com/ca ...

  6. Python的基本数据类型,用户交互

    整数: int 常见的数字都是int类型. 用于计算或者大小的比较 在32位机器上int的范围是: -2**31-2**31-1,即-2147483648-2147483647 在64位机器上int的 ...

  7. poj1426 Find The Multiple (DFS)

    题目: Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41845   Accepted: ...

  8. windows修改docker的默认存放位置

    docker默认存储到c盘,我需要移动到其他盘. 参考了网上很多资料,结果要么移动不了,要么重启docker就回到c盘了. 最后参考docker的官方论坛,找到了解决方案.https://forums ...

  9. Codeforces Paths and Trees

    Paths and Trees time limit per test3 seconds memory limit per test256 megabytes Little girl Susie ac ...

  10. android Manifest.xml 文件详解