洛咕 P2336 [SCOI2012]喵星球上的点名


先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了

有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个点集计算和多少个区间有交。

第一个,HH的项链的树状数组做法

第二个,因为是点集所以要去重,假设点集有\(a_1,a_2,\cdots,a_k\),可以对每个区间只再覆盖的第一个点做记录

就是记录\(\sum_{i=1}^k\sum_{\texttt{interval }[l,r]}\left[l\in[a_{i-1}+1,a_i],r\geq a_i\right]\)

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(!isdigit(ch)){
  9. if(ch=='-')f=-1;
  10. ch=getchar();
  11. }
  12. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. std::vector<int>A[100010],B[100010],C[100010],S,P;
  16. int len,x[400010],y[400010],t[400010],SA[400010],rk[400010];
  17. int ht[400010];
  18. il bool cmp(int a,int b,int k){return y[a]==y[b]&&y[a+k]==y[b+k];}
  19. int ans1[100010],ans2[100010];
  20. int lg[400010],st[19][400010];
  21. il int query(int l,int r){
  22. int g=lg[r-l+1];
  23. return std::min(st[g][l],st[g][r-(1<<g)+1]);
  24. }
  25. std::vector<int>ins[400010],del[400010],p_del[400010];
  26. int Tree[400010],Tree2[400010],lst[400010],LL[400010],RR[400010];
  27. il vd update(int*t,int p,int x){while(p<=len)t[p]+=x,p+=p&-p;}
  28. il int query(int*t,int r){int ret=0;while(r)ret+=t[r],r-=r&-r;return ret;}
  29. int main(){
  30. int n=gi(),m=gi();
  31. for(int i=1;i<=n;++i){
  32. len=gi();
  33. while(len--)A[i].push_back(gi()+200000);
  34. len=gi();
  35. while(len--)B[i].push_back(gi()+200000);
  36. }
  37. for(int i=1;i<=m;++i){
  38. len=gi();
  39. while(len--)C[i].push_back(gi()+200000);
  40. }
  41. S.push_back(233333);
  42. P.push_back(0);
  43. int sep=0;
  44. for(int i=1;i<=n;++i){
  45. S.insert(S.end(),A[i].begin(),A[i].end());
  46. S.push_back(++sep);
  47. for(int j=0;j<A[i].size();++j)P.push_back(i);
  48. P.push_back(0);
  49. }
  50. for(int i=1;i<=n;++i){
  51. S.insert(S.end(),B[i].begin(),B[i].end());
  52. S.push_back(++sep);
  53. for(int j=0;j<B[i].size();++j)P.push_back(i);
  54. P.push_back(0);
  55. }
  56. for(int i=1;i<=m;++i){
  57. S.insert(S.end(),C[i].begin(),C[i].end());
  58. S.push_back(++sep);
  59. P.push_back(-i);
  60. for(int j=0;j<C[i].size();++j)P.push_back(0);
  61. }
  62. len=S.size()-1;
  63. int tot=400000;
  64. for(int i=1;i<=len;++i)++t[x[i]=S[i]];
  65. for(int i=1;i<=tot;++i)t[i]+=t[i-1];
  66. for(int i=len;i;--i)SA[t[x[i]]--]=i;
  67. for(int k=1;k<=len;k<<=1){
  68. int p=0;
  69. for(int i=0;i<=tot;++i)y[i]=0;
  70. for(int i=len-k+1;i<=len;++i)y[++p]=i;
  71. for(int i=1;i<=len;++i)if(SA[i]>k)y[++p]=SA[i]-k;
  72. for(int i=0;i<=tot;++i)t[i]=0;
  73. for(int i=1;i<=len;++i)++t[x[y[i]]];
  74. for(int i=1;i<=tot;++i)t[i]+=t[i-1];
  75. for(int i=len;i;--i)SA[t[x[y[i]]]--]=y[i];
  76. std::swap(x,y),x[SA[1]]=p=1;
  77. for(int i=2;i<=len;++i)x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;
  78. if(p>=len)break;tot=p;
  79. }
  80. for(int i=1;i<=len;++i)rk[SA[i]]=i;
  81. int k=0;
  82. for(int i=1;i<=len;++i){
  83. if(rk[i]==len)continue;
  84. if(k)--k;
  85. int j=SA[rk[i]+1];
  86. while(S[i+k]==S[j+k])++k;
  87. ht[rk[i]]=k;
  88. }
  89. for(int i=2;i<=len;++i)lg[i]=lg[i>>1]+1;
  90. for(int i=1;i<len;++i)st[0][i]=ht[i];
  91. for(int i=1;i<=lg[len];++i)
  92. for(int j=1;j+(1<<i)-1<len;++j)
  93. st[i][j]=std::min(st[i-1][j],st[i-1][j+(1<<i-1)]);
  94. for(int i=1;i<=len;++i)
  95. if(P[SA[i]]<0){
  96. int l=1,r=i,mid,sz=C[-P[SA[i]]].size();
  97. while(l<r){
  98. mid=(l+r)>>1;
  99. if(query(mid,i-1)<sz)l=mid+1;
  100. else r=mid;
  101. }
  102. int L=l;
  103. ins[l].push_back(L);
  104. LL[-P[SA[i]]]=l;
  105. l=i,r=len;
  106. while(l<r){
  107. mid=(l+r)>>1;
  108. if(query(i,mid)>=sz)l=mid+1;
  109. else r=mid;
  110. }
  111. del[l+1].push_back(L);
  112. p_del[l+1].push_back(-P[SA[i]]);
  113. RR[-P[SA[i]]]=l;
  114. }
  115. for(int i=1;i<=len;++i){
  116. if(P[SA[i]]>0){
  117. update(Tree2,i,1);
  118. if(lst[P[SA[i]]])update(Tree2,lst[P[SA[i]]],-1);
  119. }
  120. for(int j=0;j<ins[i].size();++j)update(Tree,ins[i][j],1);
  121. for(int j=0;j<del[i].size();++j)update(Tree,del[i][j],-1);
  122. if(P[SA[i]]>0){
  123. ans1[P[SA[i]]]+=query(Tree,i)-query(Tree,lst[P[SA[i]]]);
  124. lst[P[SA[i]]]=i;
  125. }
  126. for(int j=0;j<del[i+1].size();++j)ans2[p_del[i+1][j]]=query(Tree2,RR[p_del[i+1][j]])-query(Tree2,LL[p_del[i+1][j]]-1);
  127. }
  128. for(int i=1;i<=m;++i)printf("%d\n",ans2[i]);
  129. for(int i=1;i<=n;++i)printf("%d ",ans1[i]);
  130. puts("");
  131. return 0;
  132. }

洛咕 P2336 [SCOI2012]喵星球上的点名的更多相关文章

  1. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告

    P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...

  2. 洛谷P2336 [SCOI2012]喵星球上的点名(后缀数组+莫队)

    我学AC自动机的时候就看到了这题,想用AC自动机结果被学长码风劝退-- 学后缀数组时又看到了这题--那就写写后缀数组做法吧 结果码风貌似比当年劝退我的学长还毒瘤啊 对所有的模式串+询问串,不同串之间用 ...

  3. P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)

    P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...

  4. Luogu P2336 [SCOI2012]喵星球上的点名

    题目链接 \(Click Here\)_ \(200\)行纯干货的代码,一发\(WA\)掉真的是让人窒息,幸好最后找到了锅在哪.(差点就要弃掉了\(QAQ\)) [调出来的时候真的是要高兴到哭出来了\ ...

  5. P2336 [SCOI2012]喵星球上的点名(SA+莫队)

    题面传送门 一道还算有点含金量的 SA 罢-- 首先按照套路我们把读入的所有字符串都粘在一起,中间用分隔符隔开并建出后缀数组出来. 我们考虑对于一个固定的字符串 \(s\),什么样的字符串 \(t\) ...

  6. BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1906  Solved: 839[Submit][St ...

  7. 【BZOJ2754】[SCOI2012]喵星球上的点名

    [BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...

  8. BZOJ 2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 649  Solved: 305[Submit][Sta ...

  9. BZOJ2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 680  Solved: 314[Submit][Sta ...

随机推荐

  1. SQL Server 合并复制遇到identity range check报错的解决 (转载)

    最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, State ...

  2. 红帽7中firewall常用指令

    1.端口管理 (1)列出DMZ区域开放的端口 ~]#firewall-cmd --zone=dmz --list-ports (2)8080端口加入dmz区 ~]#firewall-cmd --zon ...

  3. vscode对Vue文件的html部分格式化失效问题解决办法

    使用vscode编辑vue文件时发现突然格式化代码不会对<template> </template>之间的html生效了,解决办法很简单 文件 --> 首选项 ---&g ...

  4. logger.error完整打印错误堆栈信息

    所以我们的写法可以是: Logger.error("xxx出错" , e); //第二个参数是e 而不是: Logger.error("xxx出错:" + e) ...

  5. android的hwc浅析【转】

    https://blog.csdn.net/alien75/article/details/39290109 注:本文档基于kk进行分析,着重于概念的精确定义和版本历史演变 一.关于hwc的介绍 广义 ...

  6. PXE 和 计算机网络启动

    1. 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网 ...

  7. python永久添加第三方模块,PYTHONPATH的设置

    今天用pip安装pymysql后遇到了一个问题,在PyCharm中import pymysql模块时,运行却提示我找不到pymysql mudule 我先考虑的是pymysql没有安装成功,但是cmd ...

  8. 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array

    乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言     将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...

  9. Hadoop YARN简介

    背景 本文整理一些Hadoop YARN的相关内容. 简介 YARN(Yet Another Resource Negotiator)是Hadoop通用资源管理平台,为各类计算框架(离线MR.在线St ...

  10. Volley源码分析(一)RequestQueue分析

    Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...