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)的更多相关文章

  1. BZOJ4943 [NOI2017] 蚯蚓

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

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

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

  3. bzoj4943 [Noi2017]蚯蚓排队

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

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

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

  5. [NOI2017]蚯蚓排队 hash

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

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

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

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

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

  8. [NOI2017]蚯蚓排队(链表+hash)

    这题看题面感觉挺玄学的,但其实会挂链式hash就能暴力切了,就是纸老虎,考察选手的语文水平.不过三年没写挂链hash也应该写一下了…… 首先模数设成自然溢出ull,然后挂链时的模数取2^24.然后就可 ...

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

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

随机推荐

  1. python-numpy-pandas

    目录 numpy 模块 创建矩阵方法: 获取矩阵的行列数 切割矩阵 矩阵元素替换 矩阵的合并 通过函数创建矩阵 矩阵的运算 pandas模块 series (一维列表) DataFrame DataF ...

  2. GoF23种设计模式之行为型模式之命令模式

    一.概述 将一个请求封装为一个对象,从而可以使用不同的请求对客户端进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 二.适用性 1.当抽象出待执行的动作以参数化某个对象的时候. 2.当需要在 ...

  3. HDU - 1864 最大报销额 (背包)

    题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...

  4. poj 1742 多重背包问题 dp算法

    题意:硬币分别有 A1.....An种,每种各有C1......Cn个,问组成小于m的有多少种 思路:多重背包问题 dp[i][j]表示用前i种硬币组成j最多剩下多少个  dp=-1的表示凑不齐 dp ...

  5. SpringMVC之Controller简单使用

    //环境 spring-4.3.18/JDK1.8/开发工具/IntelliJ IDEA 2018.2.5 x64 //工程结构图 //web.xml <?xml version="1 ...

  6. LA 5007 Detector Placement 模拟

    题意: 给出一束光线(射线),和一块三角形的棱镜 以及 棱镜的折射率,问光线能否射到X轴上,射到X轴上的坐标是多少. 分析: 其实直接模拟就好了,注意到题目中说不会发生全反射,所以如果射到棱镜中的话就 ...

  7. HDU 1827 强连通 缩点 Summer Holiday

    求出强连通分量,因为强连通中只要有一个人被通知到了,所有人都能被通知到. 缩点以后形成一个DAG,找出那些入度为0的点,累加上它们的权值就是答案.一个点的权值等于SCC中权值最小的那个点. #incl ...

  8. python socket相关

    套接字的工作流程(基于TCP和 UDP两个协议) TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信( ...

  9. 光学字符识别OCR-3

    连通性 可以看到,每一层的图像是由若干连通区域组成的,文字本身是由笔画较为密集组成的,因此往往文字也能够组成一个连通区域.这里的连通定义为 8邻接,即某个像素周围的8个像素都定义为邻接像素,邻接的像素 ...

  10. 转 关于oracle 分区表 表空间以及索引的总结

    关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文 ...