题目链接

洛谷P3832

题解

字符串哈希然后丢到hash表里边查询即可

因为\(k \le 50\),1、2操作就暴力维护一下

经复杂度分析会发现直接这样暴力维护是对的

一开始自然溢出WA了,还以为是哈希冲突,改成双哈希后依旧WA

后来才发现是sb了漏了一句QAQ

不卡自然溢出

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define ULL unsigned long long int
#define REP(i,n) for (register int i = 1; i <= (n); i++)
#define res register
using namespace std;
const int maxn = 200005,maxh = 10000005,INF = 1000000000;
const int md = 998244353,P = 19260817;
inline int read(){
res int out = 0,flag = 1; res char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
inline void write(int x){
if (x / 10) write(x / 10);
putchar(x % 10 + '0');
}
struct Hash_Chart{
ULL num[maxh];
int head[P + 5],nxt[maxh],cnt,sum[maxh];
void ins(ULL x){
int id = x % P;
if (!head[id]){
head[id] = ++cnt;
num[cnt] = x;
sum[cnt] = 1;
return;
}
for (res int k = head[id]; k; k = nxt[k]){
if (num[k] == x) {sum[k]++; return;}
if (!nxt[k]){
nxt[k] = ++cnt;
num[cnt] = x;
sum[cnt] = 1;
return;
}
}
}
void del(ULL x){
int id = x % P;
for (res int k = head[id]; k; k = nxt[k])
if (num[k] == x) {sum[k]--; return;}
}
int find(ULL x){
int id = x % P;
for (res int k = head[id]; k; k = nxt[k]){
if (num[k] == x) return sum[k];
}
return 0;
}
}hash;
ULL bin[maxn],num[maxn],s1[maxn],s2[maxn];
int lk[maxn],rk[maxn],t1,t2,n,m;
char s[maxh];
inline void solve1(){
int u = read(),v = read();
t1 = 0;
for (res int k = u; k && t1 < 50; k = lk[k]){
++t1;
s1[t1] = s1[t1 - 1] + bin[t1 - 1] * num[k];
}
t2 = 0;
for (res int k = v; k && t2 < 50; k = rk[k]){
++t2;
s2[t2] = s2[t2 - 1] * 7 + num[k];
}
for (res int i = 1; i <= t1; i++)
for (res int j = 1; j <= t2 && i + j <= 50; j++)
hash.ins(s2[j] + s1[i] * bin[j]);
rk[u] = v; lk[v] = u;
}
inline void solve2(){
int u = read(),v = rk[u];
t1 = 0;
for (res int k = u; k && t1 < 50; k = lk[k]){
++t1;
s1[t1] = s1[t1 - 1] + bin[t1 - 1] * num[k];
}
t2 = 0;
for (res int k = v; k && t2 < 50; k = rk[k]){
++t2;
s2[t2] = s2[t2 - 1] * 7 + num[k];
}
for (res int i = 1; i <= t1; i++)
for (res int j = 1; j <= t2 && i + j <= 50; j++)
hash.del(s2[j] + s1[i] * bin[j]);
rk[u] = lk[v] = 0;
}
inline void solve3(){
scanf("%s",s + 1); s[0] = '0';
int len = strlen(s + 1),k = read();
LL ans = 1; ULL h = 0;
for (res int i = 1; i <= len; i++){
h = h * 7 + s[i] - '0';
if (i >= k){
h -= bin[k] * (s[i - k] - '0');
ans = ans * hash.find(h) % md;
}
}
write(ans); putchar('\n');
}
int main(){
bin[0] = 1; for (res int i = 1; i < maxn; i++) bin[i] = bin[i - 1] * 7;
n = read(); m = read(); int opt;
REP(i,n) hash.ins(num[i] = read());
while (m--){
opt = read();
if (opt == 1) solve1();
else if (opt == 2) solve2();
else solve3();
}
return 0;
}

洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】的更多相关文章

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

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

  2. 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)

    题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...

  3. 洛谷P3234 抄卡组 [HNOI2014] 字符串hash

    正解:字符串hash 解题报告: 传送门! 字符串hash是字符串匹配中很常见的一个方法,原理也很好懂,这里就不做太多阐述辣有时间放到hash笔记里面去QAQ 题意不说了挺好理解的,自带一句话概括好评 ...

  4. 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]

    题目传送门 A Horrible Poem 题目描述 Bytie boy has to learn a fragment of a certain poem by heart. The poem, f ...

  5. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

    Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...

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

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

  7. [NOI2017]蚯蚓排队 hash

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

  8. 【题解】洛谷P2827 [NOIP2016TG] 蚯蚓(优先队列)

    题目来源:洛谷P2827 思路 阅读理解题 一开始以为是裸的优先队列而已 但是发现维护一个切开并且其他的要分别加上一个值很不方便 而且如果直接用优先队列会TLE3到4个点 自测85分 所以我们需要发现 ...

  9. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...

随机推荐

  1. jq中append(),appendTo(),after(),before(),prepend(),prependTo()的用法

    1. append():往当前元素的内部的后面追加元素; eg:$("div").append($("span"));  将span放在div内部的后面. 2. ...

  2. python_68_迭代器

    ''' 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  3. 快速排序算法思路分析和C++源代码(递归和非递归)

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试喜欢考这个. 快速排序是C.R.A.Hoar ...

  4. Luogu [P1334] 瑞瑞的木板(手写堆)

    其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...

  5. cin对象的一些常用方法使用总结

    >> 最初定义的是右移,当但是出现在 cin >>中的时候这个符号被重载了,变成了一个流操作,在用户通过键盘输入信息的时候,所有内容都会先直接存储在一个叫输入缓冲区的的地方,c ...

  6. 重温 JSP 与 Servlet

    Java Web使用SSH框架多了,很多基础的 JSP 与 Servlet 的东西都忘记了.最近在 JSP 标签 和 Struts2 包装的 Session 对象的混合使用时弄晕了,就翻书温习下. J ...

  7. 扩展 -------jQuery

    本文摘要:http://www.liaoxuefeng.com/ 编写jQuery插件 为了满足需求,我们经常会调用一些插件,js插件都是别人写的,今天就来了解了解一些方法. 给jQuery对象绑定一 ...

  8. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法

    错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...

  9. [Hdu3555] Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

  10. Apache虚拟主机测试

    一.虚拟机主机简介 部署多个站点,每个站点,希望用不同的域名和站点目录,或者是不同的端口,或不同的ip,就需要虚拟主机功能.简单的说一个http服务要配置多个站点,就需要虚拟主机.(一句话一个http ...