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》读书笔记,第一章:python数据模型

    这本书上来就讲了魔法方法,也叫双下方法.特殊方法,通过两个例子对让读者了解了双下方法的用法,更重要的是,让我一窥Python的语言风格和给使用者的自由度. 第一个例子:一摞Python风格的纸牌: i ...

  2. 水题:51Nod1095-Anigram单词

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Description 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那 ...

  3. jubeeeeeat(网络流)

    jubeeeeeat 总时间限制:  1000ms 内存限制:  256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐节奏要求玩 ...

  4. Python虚拟机函数机制之位置参数(四)

    位置参数的传递 前面我们已经分析了无参函数的调用过程,我们来看看Python是如何来实现带参函数的调用的.其实,基本的调用流程与无参函数一样,而不同的是,在调用带参函数时,Python虚拟机必须传递参 ...

  5. ubuntu linux下各种格式软件包的安装卸载

    http://www.cnblogs.com/mo-beifeng/archive/2011/08/14/2137954.html

  6. day01_07.逻辑与字符串运算符

    &&(并且)====>发现&符号总是打错,记忆口令:&7(暗器),在数字7上面,在python中是and ||(或者)====>在python中是or . ...

  7. The 18th Zhejiang University Programming Contest Sponsored by TuSimple

    Pretty Matrix Time Limit: 1 Second      Memory Limit: 65536 KB DreamGrid's birthday is coming. As hi ...

  8. 安装anaconda并配置环境

    安装anaconda的步骤 1.确定系统信息 uname -a 2.下载对应版本 3.sh 安装shell脚本 4.添加到对应路径 5.安装完anaconda之后,创建虚拟环境 conda creat ...

  9. 浏览器提示ERR_CONTENT_DECODING_FAILED,Gzip压缩数据无法解压

    最近在页面上有个显示数据表格的功能,数据由后台传给前台JS表格插件.数据格式为JSON 由于数据量很大,就想到用GZIP压缩以后传给前台.压缩前,某个表格的数据量达到3M多,用GZIP压缩后就200K ...

  10. JQUERY杂技

    JQUERY小技巧 this.value jsobject.val() #aaa:eq(2) 选择第三个id为aaa的元素 $("input")只选择input标签.如:<i ...