https://www.lydsy.com/JudgeOnline/problem.php?id=4943

http://uoj.ac/problem/315

https://www.luogu.org/problemnew/show/P3823#sub

题面太长自己看吧orz。

参考:洛谷题解。

用链表暴力维护每个蚯蚓,每次合并和分离只对k*k的元素有影响,哈希一下存起来query时候比较就好了。

没了。

(具体复杂度我不会证明,以及bzoj卡空间,正常的哈希表空间总觉得不能开如代码所示的这么小。)

(自然溢出hash真的块)

#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+;
const int K=;
const int mod=;
const int p=;
const int B=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int nxt,cnt;
ll w;
}e[];
char s[];
int n,m,cnt,head[p+],t[],a[N];
int nxt[N],pre[N];
ull f[K*+],base[K+];
inline void add(ull w,int on){
int u=w%p;
for(int i=head[u];i;i=e[i].nxt){
if(e[i].w==w){
e[i].cnt+=on;return;
}
}
e[++cnt].cnt=;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
inline int ask(ull w){
int u=w%p;
for(int i=head[u];i;i=e[i].nxt){
if(e[i].w==w)return e[i].cnt;
}
return ;
}
void merge(int x,int y){
int l=K+,r=K;
memset(f,,sizeof(f));
for(int i=x;i&&l>;i=pre[i])f[--l]=a[i];
for(int j=y;j&&r<*K;j=nxt[j])f[++r]=a[j];
for(int i=l;i<=r;i++)f[i]+=f[i-]*B;
for(int i=l;i<=K;i++){
for(int j=K+;j<=min(r,i+K-);j++){
add(f[j]-f[i-]*base[j-i+],);
}
}
nxt[x]=y;pre[y]=x;
}
void split(int x,int y){
int l=K+,r=K;
memset(f,,sizeof(f));
for(int i=x;i&&l>;i=pre[i])f[--l]=a[i];
for(int j=y;j&&r<*K;j=nxt[j])f[++r]=a[j];
for(int i=l;i<=r;i++)f[i]+=f[i-]*B;
for(int i=l;i<=K;i++){
for(int j=K+;j<=min(r,i+K-);j++){
add(f[j]-f[i-]*base[j-i+],-);
}
}
nxt[x]=;pre[y]=;
}
int query(int k){
ll ans=;ull val=;int len=strlen(s+);
if(k==)
for(int i=;i<=len;i++)
ans=ans*t[s[i]-'']%mod;
else{
for(int i=;i<=len;i++){
val=val*B+s[i]-'';
if(i>k)val-=base[k]*(s[i-k]-'');
if(i>=k)ans=ans*ask(val)%mod;
}
}
return ans;
}
int main(){
n=read(),m=read();
base[]=;
for(int i=;i<=K;i++)base[i]=base[i-]*B;
for(int i=;i<=n;i++){
a[i]=read();t[a[i]]++;
}
for(int i=;i<=m;i++){
int op=read();
if(op==){
int x=read(),y=read();
merge(x,y);
}
if(op==){
int x=read();
split(x,nxt[x]);
}
if(op==){
scanf("%s",s+);
int k=read();
printf("%d\n",query(k));
}
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

最新文章

  1. vs连接服务器sql server数据库 web.config和代码
  2. CentOS下mysql默认安装位置
  3. jquery的基本事件大全
  4. 学习笔记--Grunt、安装、图文详解
  5. PetaPoco更新记录方法
  6. webrtc学习———记录三:mediaStreamTrack
  7. linux上传下载软件
  8. BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
  9. meta标签使360浏览器默认极速模式
  10. 连接greenvpn 公司内网连接
  11. Java第四次上课博文动手动脑
  12. 201521123019 《Java程序设计》第10周学习总结
  13. J2EE中MVC的各层的设计原则及其编写注意事项
  14. jenkins测试配置
  15. python基础之虚拟环境--常用指令
  16. Python自学:第二章 注释
  17. python爬虫爬取页面源码在本页面展示
  18. 【剑指offer】数值的整数次方
  19. python3.6 ImportWarning: can&#39;t resolve package from __spec__ or __package__, falling back on __name__ and __path__
  20. Unity3D中人物模型的构成

热门文章

  1. webpack loader 生成虚拟文件的方案
  2. 从细节处谈Android冷启动优化
  3. pg mysql 比较
  4. MySQL日期、字符串、时间戳互转
  5. 【isJson( jsonObj )】判断是否是JSON实例
  6. 银行系统ps:不太完善,蟹蟹评论
  7. leetcode-反转链表
  8. * 197. Permutation Index【LintCode by java】
  9. 周期串 (Periodic Strings,UVa455)
  10. Paper Reading - Learning like a Child: Fast Novel Visual Concept Learning from Sentence Descriptions of Images ( ICCV 2015 )