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);
}
}
}

最新文章

  1. Java中的常见面试题
  2. Agent理解
  3. SQL注入的原理以及危害
  4. Apache Solr查询语法
  5. TYVJ P1007 排座椅 Label:多想想输出 水
  6. React生命周期和虚拟DOM
  7. T-SQL:SQL Server-数据开发(经典)
  8. android的ScaleGestureDetector缩放类详解
  9. ps一般常用的快捷键
  10. CUDA网格限制
  11. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
  12. zoj1093 Monkey and Banana
  13. REST Service 基础 A further step.
  14. React Native 之 网络请求
  15. Android系统--输入系统(八)Reader线程_使用EventHub读取事件
  16. Angular表单控件需要类型和实际值类型不一致时实现双向绑定
  17. 利用intellijidea创建maven多模块项目
  18. 201521123065《Java程序设计》第1周学习总结
  19. Python内置函数(51)——property
  20. mysql之用户权限管理

热门文章

  1. linux中vim永久显示行号、开启语法高亮
  2. Leetcode(204) Count Primes
  3. 逃离迷宫 HDU - 1728(bfs)
  4. (转)JVM各种内存溢出是否产生dump
  5. redis--py操作redis【转】
  6. 卸载firefox多余的搜索引擎
  7. python基础学习笔记——面向对象初识
  8. python基础学习笔记——运算符
  9. 细嚼慢咽 Mongoose 5
  10. python - web自动化测试 - 文件上传操作