$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面;让一队蚯蚓从某个蚯蚓后面断成两队;问:给个字符串,问他的。。算了你们直接看题吧

这什么沙雕题QAQ

所有询问的串只有$nk$种,把他们全丢进hash里面就好了。。注意双hash,一个用来当链表一个用来在链表里判重。

复杂度的话,只考虑合并是$nk$的(相当于把所有串算一次),而拆分是$ck^2$的,拆对合并的复杂度影响是跟拆本身复杂度一样的。

  1. //#include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. //#include<math.h>
  5. //#include<set>
  6. //#include<queue>
  7. //#include<bitset>
  8. //#include<vector>
  9. #include<algorithm>
  10. #include<stdlib.h>
  11. using namespace std;
  12.  
  13. #define LL long long
  14. int qread()
  15. {
  16. char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
  17. do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
  18. }
  19.  
  20. //Pay attention to '-' , LL and double of qread!!!!
  21.  
  22. int n,m;
  23. #define maxn 200011
  24. #define maxh 1000007
  25. int a[maxn],bb[]; LL cc[];
  26.  
  27. struct Hash
  28. {
  29. struct Edge{LL to; int v,next;}edge[maxn*]; int first[maxh],le;
  30. Hash() {le=;}
  31. void in(LL x,int h,int v)
  32. {
  33. for (int i=first[h];i;i=edge[i].next)
  34. {
  35. Edge &e=edge[i];
  36. if (e.to==x) {e.v+=v; return;}
  37. }
  38. Edge &e=edge[le]; e.to=x; e.v=; e.next=first[h]; first[h]=le++;
  39. }
  40. int find(LL x,int h)
  41. {
  42. for (int i=first[h];i;i=edge[i].next)
  43. {
  44. Edge &e=edge[i];
  45. if (e.to==x) return e.v;
  46. }
  47. return ;
  48. }
  49. }h;
  50.  
  51. int Nxt[maxn],Pre[maxn];
  52. char s[maxn*]; int len;
  53. int main()
  54. {
  55. bb[]=; for (int i=;i<=;i++) bb[i]=bb[i-]*%maxh;
  56. cc[]=; for (int i=;i<=;i++) cc[i]=cc[i-]*;
  57. n=qread(); m=qread();
  58. for (int i=;i<=n;i++) {Pre[i]=Nxt[i]=; a[i]=qread(); h.in(a[i],a[i],);}
  59. int op; char c; int x,y;
  60. while (m--)
  61. {
  62. op=qread();
  63. if (op==)
  64. {
  65. x=qread(); y=qread();
  66. Nxt[x]=y; Pre[y]=x;
  67. LL B=,C=;
  68. for (int i=x,cnt=,w=;cnt && i;i=Pre[i],w++,cnt--)
  69. {
  70. B=(B+1ll*a[i]*bb[w])%maxh;
  71. C=C+1ll*a[i]*cc[w];
  72. LL nb=B,nc=C;
  73. for (int j=y,k=;j && k<=cnt;j=Nxt[j],k++)
  74. {
  75. nb=(nb*+a[j])%maxh;
  76. nc=nc*+a[j];
  77. h.in(nc,nb,);
  78. }
  79. }
  80. }
  81. else if (op==)
  82. {
  83. x=qread(); y=Nxt[x];
  84. Nxt[x]=; Pre[y]=;
  85. LL B=,C=;
  86. for (int i=x,cnt=,w=;cnt && i;i=Pre[i],w++,cnt--)
  87. {
  88. B=(B+1ll*a[i]*bb[w])%maxh;
  89. C=C+1ll*a[i]*cc[w];
  90. LL nb=B,nc=C;
  91. for (int j=y,k=;j && k<=cnt;j=Nxt[j],k++)
  92. {
  93. nb=(nb*+a[j])%maxh;
  94. nc=nc*+a[j];
  95. h.in(nc,nb,-);
  96. }
  97. }
  98. }
  99. else if (op==)
  100. {
  101. len=;
  102. while ((c=getchar())<'' || c>'');
  103. do s[++len]=c; while ((c=getchar())>='' && c<='');
  104. x=qread();
  105. LL B=,C=;
  106. for (int i=;i<x;i++) B=(B*+s[i]-'')%maxh,C=C*+s[i]-'';
  107. int ans=;
  108. for (int i=x;i<=len;i++)
  109. {
  110. B=(B*+s[i]-'')%maxh; C=C*+s[i]-'';
  111. ans=1ll*ans*h.find(C,B)%;
  112. B=(B-(s[i-x+]-'')*bb[x-])%maxh+maxh; B%=maxh;
  113. C=C-(s[i-x+]-'')*cc[x-];
  114. }
  115. printf("%d\n",ans);
  116. }
  117. }
  118. return ;
  119. }

LOJ#2303. 「NOI2017」蚯蚓排队的更多相关文章

  1. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  2. LOJ2303 「NOI2017」蚯蚓排队

    「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...

  3. 「NOI2017」蚯蚓排队 解题报告

    「NOI2017」蚯蚓排队 这题真的草 你考虑\(k\)这么小,每次合并两个串,增加的有用串的数量是\(O(k^2)\)的,暴力加入这些串,求一下这些串的Hash值,塞到Hash表里面去 这里采用类似 ...

  4. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  5. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  6. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  7. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

  8. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

  9. LOJ#2307. 「NOI2017」分身术

    $n \leq 100000$个点,$m \leq 100000$次询问,每次问删掉一些点后的凸包面积. 不会啦写个20暴力,其实是可以写到50的.当个计算几何板子练习. //#include< ...

随机推荐

  1. java基础—面向对象2

    一.JAVA类的定义

  2. php面试相关

    22.描述一下大流量高并发量网站的解决方案 答: 1.确认服务器硬件是否足够支持当前的流量. 2.使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库. ...

  3. 【模板】无旋Treap(FHQ)

    如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...

  4. rest_framework之status HTTP状态码

    Django Rest Framework有一个status.py的文件 通常在我们Django视图(views)中,HTTP状态码使用的是纯数字,像400,404,200,304等,并不是那么很好理 ...

  5. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

  6. C#基础-数组-冒泡排序

    冒泡排序基础 冒泡排序原理图分析 tmp在算法中起到数据交换的作用 int[] intNums = { 12,6,9,3,8,7 }; int tmp = intNums[0]; // 一共5次冒泡, ...

  7. Python爬虫系列-分析Ajax请求并抓取今日头条街拍图片

    1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. 2.抓取详情页内容 解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 3.下载图片与保存数据库 将 ...

  8. 如何使用jmeter做接口测试

    1.传参:key=value形式 2.传参:json格式 3.jmeter上传文件 4.jmeter传cookie 或者使用 HTTP Cookie管理器

  9. Python数据分析实战视频教程【小蚊子数据分析实战课程】

    点击了解更多Python课程>>> Python数据分析实战视频教程[小蚊子数据分析实战课程] [课程概述] Python数据分析实战' 适用人群:适合需提升竞争力.提升工作效率.喜 ...

  10. python可视化动态图表: 关于pyecharts的sankey桑基图绘制

    最近因工作原因,需要处理一些数据,顺便学习一下动态图表的绘制.本质是使具有源头的流动信息能够准确找到其上下级关系和流向. 数据来源是csv文件 导入成为dataframe之后,列为其车辆的各部件供应商 ...