这题看题面感觉挺玄学的,但其实会挂链式hash就能暴力切了,就是纸老虎,考察选手的语文水平。不过三年没写挂链hash也应该写一下了……

首先模数设成自然溢出ull,然后挂链时的模数取2^24。然后就可以直接hash了。对于3操作直接O(Σ|S|)询问即可,对于1、2操作,直接暴力加、减长度不超过50的字符,毕竟k<=50,这是个关键性条件。所以暴力能切了。

下面分析时间复杂度:先假设没有2操作,因为每一个位置只有长度不超过50的,每次加的数量也是不超过50的,这样总复杂度是均摊O(nk)的;再考虑2操作,因为2操作数量很少,而且每次只会至多影响O(k2)个数,因此考虑2操作后,复杂度是O(ck2)的,于是总复杂度是O(nk+ck2+Σ|S|)。注意hash不能用map,要挂链,因为map自带大常数和log,为什么不能unordered_map呢?因为这是NOI,不能用c++11。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=5e5+,p=,mod=,gloid=(<<)-;
int n,m,q,a[N],pre[N],nxt[N],cnt[N],f[];
ull h[],pw[];
char s[];
struct Hash{
struct edge{ull x;int v,nxt;}e[];
int hd[gloid+],ecnt;
void add(ull x,int d)
{
int u=x&gloid;
for(int i=hd[u];i;i=e[i].nxt)if(e[i].x==x){e[i].v+=d;return;}
e[++ecnt]=(edge){x,d,hd[u]},hd[u]=ecnt;
}
int query(ull x)
{
int u=x&gloid;
for(int i=hd[u];i;i=e[i].nxt)if(e[i].x==x)return e[i].v;
return ;
}
}mp;
void merge()
{
int x,y,L=,R=;scanf("%d%d",&x,&y);
memset(f,,sizeof f);
for(int i=x;i&&L>;i=pre[i])f[--L]=a[i];
for(int i=y;i&&R<;i=nxt[i])f[++R]=a[i];
for(int i=;i<=R;i++)h[i]=h[i-]*p+f[i];
for(int i=L;i<=;i++)
for(int j=;j<=min(R,i+);j++)
mp.add(h[j]-h[i-]*pw[j-i+],);
nxt[x]=y,pre[y]=x;
}
void split()
{
int x,y,L=,R=;scanf("%d",&x),y=nxt[x];
memset(f,,sizeof f);
for(int i=x;i&&L>;i=pre[i])f[--L]=a[i];
for(int i=y;i&&R<;i=nxt[i])f[++R]=a[i];
for(int i=;i<=R;i++)h[i]=h[i-]*p+f[i];
for(int i=L;i<=;i++)
for(int j=;j<=min(R,i+);j++)
mp.add(h[j]-h[i-]*pw[j-i+],-);
nxt[x]=pre[y]=;
}
int query()
{
scanf("%s",s+);
int len=strlen(s+),ret=,k;
scanf("%d",&k);
ull val=;
if(k==)
{
for(int i=;i<=len;i++)ret=1ll*ret*cnt[s[i]]%mod;
return ret;
}
for(int i=;i<=len;i++)
{
val=val*p+s[i];
if(i>k)val-=pw[k]*s[i-k];
if(i>=k)ret=1ll*ret*mp.query(val)%mod;
}
return ret;
}
int main()
{
scanf("%d%d",&n,&q);
pw[]=;for(int i=;i<=;i++)pw[i]=pw[i-]*p;
for(int i=;i<=n;i++)scanf("%d",&a[i]),a[i]+='',cnt[a[i]]++;
while(q--)
{
int op;scanf("%d",&op);
if(op==)merge();
else if(op==)split();
else printf("%d\n",query());
}
}

[NOI2017]蚯蚓排队(链表+hash)的更多相关文章

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

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

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

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

  3. [NOI2017]蚯蚓排队 hash

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

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

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

  5. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

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

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

  7. bzoj4943 [Noi2017]蚯蚓排队

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

  8. [NOI2017]蚯蚓排队

    嘟嘟嘟 现在看来这道题还不是特别难. 别一看到字符串就想SAM 看到\(k\)很小,所以我们可以搞一个单次修改复杂度跟\(k\)有关的算法. 能想到,每一次断开或链接,最多只会影响\(k ^ 2\)个 ...

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

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

随机推荐

  1. c/c++ 计算屏幕的PPI

    PPI(pixels per inch)是图像分辨率的单位,表示的是每英寸所拥有的像素(pixel)数目.那如何计算勒?其实PPI计算有这相应的公式,公式为:sqrt(横向的平方+纵向的平方)/屏幕尺 ...

  2. poker2的配置使用

    1.映射Win键的诸多功能 切换输入法,shift+alt本身已经支持了,所以Win+Space就不管了 Win+Space映射为Fn+Space Win+E映射为Fn+E Win+R映射为Fn+R ...

  3. Bootstrap 侧边栏 导航栏

    http://blog.csdn.net/shangmingchao/article/details/49763351 实测效果图:

  4. HDU 4819 二维线段树

    13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...

  5. CSU-ACM2020寒假集训比赛2

    A - Messenger Simulator CodeForces - 1288E 两种解法,我选择了第二种 mn很好求,联系过就是1,没联系过就是初始位置 第一种:统计同一个人两次联系之间的出现的 ...

  6. 2.2 学习总结 之 servlet 的两次抽取

    说在前面 昨天 完成了文件上出的学习和实践 今天 学习servlet的两次抽取,以加快编写工程的速度 一.servlet 抽取的原因: 刚刚学习使用servlet写后台,往往只使用一个servlet来 ...

  7. 【Vue中的坑】Vue中的@mouseenter没反应?

    在开发中想实现鼠标悬浮,然后发现事件不由被出发,查找资料,发现并不是所有情况都不能用 下面就简单的说一下如何避免这种情况 如果你的悬浮事件是在 a 标签上,那么你直接使用就会出问题,你需要加一个nat ...

  8. 业务全都在yun上能放心吗?

    导读 组织将其业务在云上进行“全押”,这与扑克游戏中的这个激动人心时刻有着同样的吸引力.这种举动感觉很大胆,但却向外界传达了自己的信心,表明将会果断行动赢得比赛. 大多数银行对处理零售银行业务方式需要 ...

  9. Kali桥接模式下配置静态ip

    以管理员身份运行虚拟机 打开控制面板-->网络和Internet-->更改适配器 再在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...

  10. Aduino Nano 技术性能指标

    纵览 在Adnuino Nano网站上节选了该控制器的价格等,在中国买非常便宜,我用10元左右的人民币就买到了这个产品,在Arduino网站上的价格是22美金,还不包括税.这种差别是如何造成的?是国外 ...