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. JAVA基础篇—模拟服务器与客户端通信

    第一种: 客户端class Client package 服务器发送到客户端; import java.io.BufferedReader; import java.io.InputStreamRea ...

  2. LeetCode(258) Add Digits

    题目 Given a non-negative integer num, repeatedly add all its digits until the result has only one dig ...

  3. STM32F407VET6之IAR之ewarm7.80.4工程建立(基于官方固件库1.6版本) 的工程文件目录

    最后整理结构如下所示,├─cmsis│ startup_stm32f401xx.s│ startup_stm32f40xx.s│ startup_stm32f40_41xxx.s│ startup_s ...

  4. golang json 示例

    jsonStr, err := client.Get( deviceIdKey ).Result() if err == redis.Nil { deviceIds = []string{device ...

  5. Django Form one

    前戏: FromData:三种方式获取FromData 1. 创建一个FromData 的对象,然后再用append 的方法追个添加键值对 var formdata = new FormData(); ...

  6. luogu2564 [SCOI2009]生日礼物

    排序枚举左端点,则右端点必定不降 #include <algorithm> #include <iostream> #include <cstring> #incl ...

  7. ogre的初始化与启动以及显示对象设置

    ogre的使用方法1---自动设置 1.ogre初始化:首先实例化一个Root对象 Root * root = new Root(); Root * root = new Root("plu ...

  8. mysql 索引和查询优化

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能 ...

  9. python-网络编程-02

    [1] server端 首先我们看下一个最简单http服务端 import socket def handle_request(client): buf = client.recv(1024) cli ...

  10. 【java基础 12】HashMap中是如何形成环形链表的?

    导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...