「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. 谷歌SEO和百度SEO的区别

    远程桌面连接 一直有一个现象:关于谷歌优化或只是以谷歌为例谈SEO观点或技术时,经常有读者说,不适用于百度,希望多看到关于百度​​SEO的帖子上一篇利用规范的标签在谷歌排名中陷害竞争对手的帖子,就有好 ...

  2. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

  3. tree 解题报告

    tree 对于 \(n\) 个点带标号的无根森林,计算所有森林的树的个数的 \(k\) 次方,对 \(998244353\) 取模. 自闭,错了一堆关于长度的问题,这里以后一定要注意 比如需要 \(n ...

  4. iOS设计模式之工厂模式

    一,什么是工厂模式 模式定义: “专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类.” 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 需求场景: 简 ...

  5. python中的list和generator

    # -*- coding:utf-8 -*- # author : Keekuun # 列表生成式,list l1 = [i for i in range(10)] # 或者 l2 = list(ra ...

  6. appium常见问题10_MAC_终端输入aapt指令报错提示"command not found"

    问题: MAC终端使用aapt指令"aapt dump badging xxx/xxx/xxx.apk"查看apk包名和activity时报错提示"command not ...

  7. 14. Jmeter-配置元件一

    jmeter-配置元件介绍与使用 CSV 数据文件设置 HTTP信息头管理器 HTTP Cookie 管理器 HTTP Cache Manager HTTP请求默认值 计数器 DNS Cache Ma ...

  8. Bootstrap 学习笔记3 输入框和导航组件

    导航组件: 导航条组件: 导航条代码: <nav class="navbar navbar-default"> <div class="containe ...

  9. 记C函数指针的“小坑”

    今天遇到一个C函数指针的小坑,索性记下来. 我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用 比如在a.c生命一个函数指针 typedef void (*free)(void *val) ...

  10. 怎样使用haskell编写应用程序

    参考:http://stackoverflow.com/a/9153617 http://www.haskell.org/haskellwiki/How_to_write_a_Haskell_prog ...