[Bzoj4943][Noi2017]蚯蚓(hash)
4943: [Noi2017]蚯蚓
Time Limit: 50 Sec Memory Limit: 512 MB
Submit: 237 Solved: 110
[Submit][Status][Discuss]
Description
http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf
Input
Output
Sample Input
Sample Output
HINT
Source
分析:
考试时秒切的一道题,看到子串长度<=50,考虑暴力hash。bzoj内存只有四分之一差评。
AC代码:(原内存可过)
# include <iostream>
# include <cstdio>
# include <vector>
# include <cstring>
using namespace std;
typedef unsigned long long llu;
const int N = 5e5 + ;
const int M = << ;
const int mod = ;
const llu bac = ;
int n,m,a[N],hs[M + ],mx,q[N][],nex[N],pre[N];
llu id[M + ],pw[],t[M + ];
char str[M + ];
vector<llu>Q[N];
int read()
{
int x = ;char i = getchar();
while(!isdigit(i))i = getchar();
while(isdigit(i))x = x * + i - '',i = getchar();
return x;
}
int ins(llu s)
{
int u = s % M;
while(id[u])
{
if(id[u] == s)return u;
u = (u + ) & (M - );
}
id[u] = s;
return u;
}
bool add(llu s,int x)
{
int u = s % M;
while(id[u])
{
if(id[u] == s)return hs[u] += x;
u = (u + ) & (M - );
}
return ;
}
int lc[],rc[],lx,rx,p;llu g[];
void solve(int x,int y,int d)
{
lx = rx = p = ;
for(int i = ,u = x;i < mx && u;i++,u = pre[u])lc[++lx] = a[u];
for(int i = ,u = y;i < mx && u;i++,u = nex[u])rc[++rx] = a[u];
for(int i = lx;i >= ;i--)g[++p] = lc[i];
for(int i = ;i <= rx;i++)g[++p] = rc[i];
for(int i = ;i <= p;i++)g[i] = g[i - ] * bac + g[i];
for(int i = ;i < lx;i++)
{
int r = min(i + mx,p);
for(int j = lx + ;j <= r;j++)
add(g[j] - g[i] * pw[j - i],d);
}
}
int main()
{
pw[] = ;for(int i = ;i <= ;i++)pw[i] = pw[i - ] * bac;
n = read();m = read();
for(int i = ;i <= n;i++)a[i] = read();
for(int i = ;i <= m;i++)
{
q[i][] = read();
if(q[i][] == )q[i][] = read(),q[i][] = read();
else if(q[i][] == )q[i][] = read();
else
{
scanf("%s",str + );int len = strlen(str + );
int k = read();
mx = max(mx,k);
for(int j = ;j <= len;j++)t[j] = t[j - ] * bac + str[j] - '';
for(int j = k;j <= len;j++)
Q[i].push_back(ins(t[j] - t[j - k] * pw[k]));
}
}
for(int i = ;i <= n;i++)add(a[i],);
for(int i = ;i <= m;i++)
{
int x,y;
if(q[i][] == )
{
x = q[i][];y = q[i][];
nex[x] = y;pre[y] = x;
solve(x,y,);
}
else if(q[i][] == )
{
x = q[i][];y = nex[x];
nex[x] = pre[y] = ;
solve(x,y,-);
}
else
{
llu ans = ;
for(int j = ;j < Q[i].size();j++)
ans = ans * (llu)hs[Q[i][j]] % mod;
printf("%d\n",(int)ans);
}
}
}
[Bzoj4943][Noi2017]蚯蚓(hash)的更多相关文章
- BZOJ4943 [NOI2017] 蚯蚓
题目描述 蚯蚓幼儿园有nn 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从11 到nn 的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示,根据入园要求,所有蚯蚓的长 ...
- BZOJ4943 NOI2017蚯蚓排队(哈希+链表)
能看懂题就能想到正解.维护所有长度不超过k的数字串的哈希值即可,用链表维护一下蚯蚓间连接情况.由于这样的数字串至多只有nk个,计算哈希值的总复杂度为O(nk),而分裂的复杂度为O(ck^2),询问复杂 ...
- bzoj4943 [Noi2017]蚯蚓排队
题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...
- 【uoj#315/bzoj4943】[NOI2017]蚯蚓排队 Hash
题目描述 给出 $n$ 个字符,初始每个字符单独成字符串.支持 $m$ 次操作,每次为一下三种之一: $1\ i\ j$ :将以 $i$ 结尾的串和以 $j$ 开头的串连到一起. $2\ i$ :将 ...
- [NOI2017]蚯蚓排队 hash
题面:洛谷 题解: 我们暴力维护当前所有队伍内的所有子串(长度k = 1 ~ 50)的出现次数. 把每个子串都用一个hash值来表示,每次改变队伍形态都用双向链表维护,并暴力更新出现次数. 现在考虑复 ...
- BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- [NOI2017]蚯蚓排队(链表+hash)
这题看题面感觉挺玄学的,但其实会挂链式hash就能暴力切了,就是纸老虎,考察选手的语文水平.不过三年没写挂链hash也应该写一下了…… 首先模数设成自然溢出ull,然后挂链时的模数取2^24.然后就可 ...
- P3823_[NOI2017]蚯蚓排队 哈希+脑子
之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...
随机推荐
- Primer C++第五版 读书笔记(一)
Primer C++第五版 读书笔记(一) (如有侵权请通知本人,将第一时间删文) 1.1-2.2 章节 关于C++变量初始化: 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义 ...
- Aizu - 1378 Secret of Chocolate Poles (DP)
你有三种盘子,黑薄,白薄,黑厚. 薄的盘子占1,厚的盘子占k. 有一个高度为L的桶,盘子总高度不能超出桶的总高度(可以小于等于).相同颜色的盘子不能挨着放. 问桶内装盘子的方案数. 如 L = 5,k ...
- HDU:5040-Instrusive
Instrusive Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Proble ...
- 光学字符识别OCR-5 文本切割
经过前面文字定位得到单行的文本区域之后,我们就可以想办法将单行的文本切割为单个的字符了.因为第三步的模型是针对单个的字符建立的,因此这一步也是必须的. 均匀切割 基于方块汉字的假设,事实上最简单的切割 ...
- joyoi tyvj1313 [NOIP2010初赛]烽火传递
单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...
- Spring Cloud(2.0)能力大致列表
微服务九大特性 出自Martin Fowler的<Microservices> 服务组件化 按业务组织团队 做"产品"的态度 智能端点与哑管道 去中心化治理 去中心化管 ...
- TensorFlow——交互式使用会话:InteractiveSession类
目的是在交互式环境下(如jupyter),手动设定当前会话为默认会话,从而省去每次都要显示地说明sess的繁琐,如:Tensor.ecal(session=sess)或sess.Operation.r ...
- Octave 里的 fminunc
ptions = optimset('GradObj', 'on', 'MaxIter', '100'); initialTheta = zeros(2,1); [optTheta, function ...
- javascript学习笔记 - 面向对象 理解对象
ECMAScript 中有两种属性:数据属性和访问器属性 一 属性类型 1.数据属性.数据属性有4个描述其行为的特性 [[Configurable]]表示能否通过delete删除属性从而重新定义属性: ...
- 读《深入浅出Mysql》第二版,笔记
买了本书,同时网上找了电子版 (My)SQL入门 DDL(Data Definition Languages) ||DESCRIBE tablename; DML(Data manipulation ...