【BZOJ4943】【NOI2017】蚯蚓排队(哈希)

题面

BZOJ

洛谷

UOJ

题解

记得去年看网络同步赛的时候是一脸懵逼的。

昨天看到\(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】蚯蚓排队(哈希)的更多相关文章

  1. BZOJ4943 NOI2017蚯蚓排队(哈希+链表)

    能看懂题就能想到正解.维护所有长度不超过k的数字串的哈希值即可,用链表维护一下蚯蚓间连接情况.由于这样的数字串至多只有nk个,计算哈希值的总复杂度为O(nk),而分裂的复杂度为O(ck^2),询问复杂 ...

  2. P3823_[NOI2017]蚯蚓排队 哈希+脑子

    之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...

  3. bzoj4943 [Noi2017]蚯蚓排队

    题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...

  4. [Bzoj4943][Noi2017]蚯蚓(hash)

    4943: [Noi2017]蚯蚓 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 237  Solved: 110[Submit][Status][D ...

  5. BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...

  6. 洛谷3823 [NOI2017] 蚯蚓排队 【哈希】

    题目分析: 从$\sum|S|$入手.共考虑$\sum|S|$个$f(t)$.所以我们要一个对于每个$f(t)$在$O(1)$求解的算法.不难想到是哈希. 然后考虑分裂和合并操作.一次合并操作要考虑合 ...

  7. 【uoj#315/bzoj4943】[NOI2017]蚯蚓排队 Hash

    题目描述 给出 $n$ 个字符,初始每个字符单独成字符串.支持 $m$ 次操作,每次为一下三种之一: $1\ i\ j$ :将以 $i$ 结尾的串和以 $j$ 开头的串连到一起. $2\ i$ :将 ...

  8. BZOJ4943 [NOI2017] 蚯蚓

    题目描述 蚯蚓幼儿园有nn 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从11 到nn 的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示,根据入园要求,所有蚯蚓的长 ...

  9. [NOI2017]蚯蚓排队 hash

    题面:洛谷 题解: 我们暴力维护当前所有队伍内的所有子串(长度k = 1 ~ 50)的出现次数. 把每个子串都用一个hash值来表示,每次改变队伍形态都用双向链表维护,并暴力更新出现次数. 现在考虑复 ...

  10. 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】

    题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...

随机推荐

  1. L018-crond的生产场景经验小节

    L018-crond的生产场景经验小节 怎么说呢,其实L018这节课还是巩固crond的知识,前半堂课主要是解决上堂课老师留的作业(在L017已经更新,拉到最后),然后剩下的半堂客主要是讲解了一些生产 ...

  2. Android开发笔记——ListView模块、缓存及性能

    ListView是Android开发中最常用的组件之一.本文将重点说明如何正确使用ListView,以及使用过程中可能遇到的问题. ListView开发模块 图片缓存 可能遇到的问题 一.ListVi ...

  3. HTTP 两种基本请求方法 GET和 POST的区别

    GET方法 1.GET交互方式是从服务器上获取数据,而并非修改数据,所以GET交互方式是安全的.就像数据库查询一样,从数据库查询数据,并不会影响数据库的数据信息,对数据库来说,也就是安全的.2.GET ...

  4. 自动化运维工具saltstack02 -- 之SaltStack的配置管理

    SaltStack的配置管理 1.配置管理说明 配置管理,顾名思义及配置与管理, salt-master的配置文件编写格式之YAML语法说明: 数据的结构通过缩进来表示,每一级用两个空格来表示缩进,如 ...

  5. HttpServletResponse 之 sendError( )

    直接返回http 401状态,提示重新登录 response.sendError(401, "当前账户未登录或会话失效,请重新登录!) HTTP状态码列表: 100Continue继续.客户 ...

  6. 算法工程师进化-NLP之主题模型

    1 引言 主题模型是文本挖掘的重要工具,近年来在学术界和工业届都获得了非常多的关注.学术界的工作主要集中在建模层面,即提出各种各样的主题模型来适应不同的场景,因此缺乏指导主题模型在工业场景落地的资源和 ...

  7. Eclipse将Java项目打成jar工具包

    jar包:就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法. jar包可分为可执行jar包和jar工具包,在这里, ...

  8. 基于marathon-lb的服务自发现与负载均衡

    参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...

  9. [寒假学习笔记](二)Python初学

    Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...

  10. python sys模块使用详情

    python常用模块目录 sys模块提供了一系列有关Python运行环境的变量和函数.1.sys.argv可以用sys.argv获取当前正在执行的命令行参数的参数列表(list).变量解释sys.ar ...