【BZOJ4943】【NOI2017】蚯蚓排队(哈希)
【BZOJ4943】【NOI2017】蚯蚓排队(哈希)
题面
题解
记得去年看网络同步赛的时候是一脸懵逼的。
昨天看到\(zsy\)做了,今天就看了看。。
这不是\(Hash\)的傻逼题吗。。。
呜。。。
开链表存一下前驱后继,因为询问长度不超过\(50\)
那么,总的串的个数不超过\(50n\),暴力\(hash\)一下然后拿哈希表存一下就好了。
我开始用的map然后TLE飞了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ull unsigned long long
#define ll long long
#define RG register
#define MAX 222222
#define MOD 998244353
const int base=233;
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
char ch[10000010];
ull pw[MAX],has[MAX];
int nt[MAX],lt[MAX],a[MAX],g[MAX<<1];
int n,m;
const int mod=7654321;
struct Hash_Table
{
int h[mod],cnt;struct Line{int len,next,w;ull s;}e[10000000];
void Add(int len,ull s,int w)
{
int u=s%mod;
for(int i=h[u];i;i=e[i].next)
if(e[i].len==len&&e[i].s==s)
{e[i].w=(e[i].w+w)%MOD;return;}
e[++cnt]=(Line){len,h[u],w,s};h[u]=cnt;
}
int Query(int len,ull s)
{
int u=s%mod;
for(int i=h[u];i;i=e[i].next)
if(e[i].len==len&&e[i].s==s)
return e[i].w;
return 0;
}
}Hash;
void Link(int x,int y)
{
nt[x]=y;lt[y]=x;
ull ls=0;int tot=0;
for(int i=x,len=49;i&&len;i=lt[i],--len)
{
ull s=0;ls+=a[i]*pw[tot++];s=ls;int l=tot+1;
for(int j=y;j&&l<=50;j=nt[j],++l)s=s*base+a[j],Hash.Add(l,s,1);
}
}
void Cut(int x)
{
int y=nt[x];ull ls=0;int tot=0;
for(int i=x,len=49;i&&len;i=lt[i],--len)
{
ull s=0;ls+=a[i]*pw[tot++];s=ls;int l=tot+1;
for(int j=y;j&&l<=50;j=nt[j],++l)s=s*base+a[j],Hash.Add(l,s,MOD-1);
}
nt[x]=lt[y]=0;
}
int Query(int len)
{
int l=strlen(ch+1),ret=1;ull s=0;
for(int i=1;i<len;++i)s=s*base+ch[i]-48;
ch[0]='0';
for(int i=len;i<=l;++i)
{
s=s*base+ch[i]-48;
s-=pw[len]*(ch[i-len]-48);
ret=1ll*ret*Hash.Query(len,s)%MOD;
}
return ret;
}
int main()
{
pw[0]=1;for(int i=1;i<MAX;++i)pw[i]=pw[i-1]*base;
n=read();m=read();
for(int i=1;i<=n;++i)Hash.Add(1,a[i]=read(),1);
while(m--)
{
int opt=read();
if(opt==1)
{
int x=read(),y=read();
Link(x,y);
}
else if(opt==2){Cut(read());}
else
{
scanf("%s",ch+1);int k=read();
printf("%d\n",Query(k));
}
}
return 0;
}
【BZOJ4943】【NOI2017】蚯蚓排队(哈希)的更多相关文章
- BZOJ4943 NOI2017蚯蚓排队(哈希+链表)
能看懂题就能想到正解.维护所有长度不超过k的数字串的哈希值即可,用链表维护一下蚯蚓间连接情况.由于这样的数字串至多只有nk个,计算哈希值的总复杂度为O(nk),而分裂的复杂度为O(ck^2),询问复杂 ...
- P3823_[NOI2017]蚯蚓排队 哈希+脑子
之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...
- bzoj4943 [Noi2017]蚯蚓排队
题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...
- [Bzoj4943][Noi2017]蚯蚓(hash)
4943: [Noi2017]蚯蚓 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 237 Solved: 110[Submit][Status][D ...
- BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 洛谷3823 [NOI2017] 蚯蚓排队 【哈希】
题目分析: 从$\sum|S|$入手.共考虑$\sum|S|$个$f(t)$.所以我们要一个对于每个$f(t)$在$O(1)$求解的算法.不难想到是哈希. 然后考虑分裂和合并操作.一次合并操作要考虑合 ...
- 【uoj#315/bzoj4943】[NOI2017]蚯蚓排队 Hash
题目描述 给出 $n$ 个字符,初始每个字符单独成字符串.支持 $m$ 次操作,每次为一下三种之一: $1\ i\ j$ :将以 $i$ 结尾的串和以 $j$ 开头的串连到一起. $2\ i$ :将 ...
- BZOJ4943 [NOI2017] 蚯蚓
题目描述 蚯蚓幼儿园有nn 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从11 到nn 的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示,根据入园要求,所有蚯蚓的长 ...
- [NOI2017]蚯蚓排队 hash
题面:洛谷 题解: 我们暴力维护当前所有队伍内的所有子串(长度k = 1 ~ 50)的出现次数. 把每个子串都用一个hash值来表示,每次改变队伍形态都用双向链表维护,并暴力更新出现次数. 现在考虑复 ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
随机推荐
- bootstrap 4 panels已被card替换
https://www.zhihu.com/question/34838389?sort=created 解决问题的思路不对,不应该搜不到就各种着急,应该理清思路, 既然 bootstrap4没有了3 ...
- charles录制https请求
之前一直用windows系统,抓包什么的都是用的fiddler或者wireshark,操作比较简单,扩展性也比较强,现在因为工作原因换了mac,在网上一直没有找到fiddler的mac版本,就只能切换 ...
- 说说ejabberd 离线消息的坑
使用过ejabberd的或许知道,也许踩过这个坑.那么就说说我们踩过的ejabberd的离线消息的坑吧. ejabberd原生的离线消息的机制是,一般用户保存100条离线消息,管理员保存5000条离线 ...
- stl源码分析之allocator
allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocat ...
- oracle数据库应用性能优化经验(培训讲义)
这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...
- 04-容器 What, Why, How
What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行.开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机 ...
- mysql 无法启动,错误1067,进程意外终止
在做项目启动mysql数据库时,经常出现 这个错误,今天总结一下 //查看了网上很多的方法,都不适用,但或许对你适用.ps:网上只提供了怎么解决这个问题,但是没有将怎么去发现问题,对症下药才是王道.而 ...
- 完美的【去重留一】SQL
DELETE consum_record FROM consum_record, ( SELECT min(id) id, user_id, monetary, consume_time FROM c ...
- arcgis--arcmap导出点的X,Y坐标
arcmap操作的
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
如何快速响应市场的变化,如何推出更有竞争力的产品,如何在竞争中脱颖而出,是国内研发企业普遍面临的核心问题,为了解决这些问题,越来越多的企业开始重视创新与研发管理,加强研发过程的规范化,集成产品开发(I ...