http://www.lydsy.com/JudgeOnline/problem.php?id=2754 (题目链接)

题意

  给出$n$个名字串,$m$个点名串,问对于每一个姓名串,它包含多少个点名串,并且每一个点名串串是多少姓名串的子串。

Solution

  暴力踩正解,乱搞能AC。暴跳fail即可

  网上终于找到了正解:http://blog.csdn.net/clover_hxy/article/details/52502544,然而不想写了。。

  

  UPD:自己脑补了一个后缀数组的做法。首先跟网上大部分后缀数组暴力的做法一样,点名串和姓名串接起来求SA。对于一个点名串长度为$len$,包含它的姓名串与它的lcp长度一定正好等于$len$。因为排好了序的后缀数组中,lcp只会随着距离的增大而减小,所以满足条件的姓名串的后缀一定是一个区间。这里最暴力的方法就是对于每一个姓名串往两边for(虽然可以AC= =),我们用ST表维护一下任意两个后缀的lcp,然后倍增求出这个区间,复杂度$O(m\log n)$

  接下来问题就转化为了:给出了一个$n$个数的序列,一共$m$个区间,问每个区间覆盖了多少个不同的数(点名串是多少姓名串的子串),每个值被多少个区间覆盖(姓名串包含多少个点名串)。两问都没有修改所以很好做。可以$O(n\sqrt{n})$的莫队艹过去,或者第一问就主席树,第二问线段树$O(n\log n)$。

  所以,你还想写吗= =,三个namespace,fuck!

细节

  buildfail时记得入队。不忽略行末空格是smg。。

代码

  1. // bzoj2754
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<cmath>
  9. #include<queue>
  10. #include<map>
  11. #define LL long long
  12. #define inf (1ll<<30)
  13. #define Pi acos(-1.0)
  14. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
  15. using namespace std;
  16.  
  17. const int maxn=100010;
  18. int n,m,a[maxn],vis[maxn],res[maxn],ans[maxn];
  19. vector<int> v[maxn][2];
  20. struct node {
  21. map<int,int> mp;
  22. vector<int> end;
  23. int next,cnt;
  24. int& operator [] (int x) {return mp[x];}
  25. }tr[maxn];
  26.  
  27. namespace ACM {
  28. int head[maxn],cnt,sz=1;
  29. struct edge {int to,next,w;}e[maxn];
  30. void link(int u,int v,int w) {
  31. e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
  32. }
  33. void insert(int *r,int len,int id) {
  34. int p=1;
  35. for (int i=1;i<=len;i++) {
  36. if (!tr[p][r[i]]) {
  37. tr[p][r[i]]=++sz;
  38. link(p,sz,r[i]);
  39. }
  40. p=tr[p][r[i]];
  41. }
  42. tr[p].end.push_back(id);tr[p].cnt++;
  43. }
  44. void buildfail() {
  45. queue<int> q;q.push(1);
  46. tr[1].next=0;
  47. while (!q.empty()) {
  48. int x=q.front();q.pop();
  49. for (int i=head[x];i;i=e[i].next) {
  50. int k=tr[x].next,c=e[i].w;
  51. while (!tr[k][c]) k=tr[k].next;
  52. tr[tr[x][c]].next=tr[k][c];
  53. q.push(tr[x][c]);
  54. }
  55. }
  56. }
  57. }
  58. using namespace ACM;
  59.  
  60. int main() {
  61. scanf("%d%d",&n,&m);
  62. for (int len,i=1;i<=n;i++) {
  63. scanf("%d",&len);
  64. for (int x,j=1;j<=len;j++) scanf("%d",&x),v[i][0].push_back(x);
  65. scanf("%d",&len);
  66. for (int x,j=1;j<=len;j++) scanf("%d",&x),v[i][1].push_back(x);
  67. }
  68. for (int i=0;i<=10000;i++) tr[0][i]=1;
  69. for (int len,i=1;i<=m;i++) {
  70. scanf("%d",&len);
  71. for (int j=1;j<=len;j++) scanf("%d",&a[j]);
  72. insert(a,len,i);
  73. }
  74. buildfail();
  75. for (int i=1;i<=n;i++)
  76. for (int t=0;t<=1;t++) {
  77. int len=v[i][t].size(),p=1;
  78. for (int j=0;j<len;j++) {
  79. while (!tr[p][v[i][t][j]]) p=tr[p].next;
  80. p=tr[p][v[i][t][j]];
  81. for (int k=p;k;k=tr[k].next)
  82. if (tr[k].cnt)
  83. for (int l=0;l<tr[k].cnt;l++) {
  84. if (vis[tr[k].end[l]]!=i) ans[tr[k].end[l]]++,res[i]++;
  85. vis[tr[k].end[l]]=i;
  86. }
  87. }
  88. }
  89. for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
  90. for (int i=1;i<=n;i++) {
  91. printf("%d",res[i]);
  92. if (i<n) printf(" ");
  93. }
  94. return 0;
  95. }

【bzoj2754】 SCOI2012—喵星球上的点名的更多相关文章

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

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

  2. [BZOJ2754] [SCOI2012]喵星球上的点名解题报告|后缀数组

    a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点名,每次读出一个串的 ...

  3. bzoj2754:[SCOI2012]喵星球上的点名(后缀自动机)

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  4. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2816  Solved: 1246[Submit][Status][Discuss] Descript ...

  5. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  6. BZOJ2754 SCOI2012喵星球上的点名

    绝世好题. 正当我犹豫不决时,hzwer说:“MAP!!!” 没错这题大大的暴力,生猛的stl,贼基尔爽,,ԾㅂԾ,, 由于我们求点名在名字中的子串个数,所以将点名建AC自动机,记录节点属于哪次点名, ...

  7. BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组

    题面 戳这里 题解 首先先把所有给出的姓名和询问全部接在一起,建出\(height\)数组. 某个串要包含整个询问串,其实就相当于某个串与询问串的\(lcp\)为询问串的长度. 而两个后缀\(Suff ...

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

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

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

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

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

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

随机推荐

  1. Delphi 7~XE系列升级安装Indy10.6

    由于低版本Indy无法满足网络技术的日益更新,如SSL/TLS请求.RawHeaders与Cookie管理等问题处理. 我本身一直在用Delphi 2007,因为D2009开始底层的编码已不同,旧项目 ...

  2. go语言之行--数组、切片、map

    一.内置函数 append :追加元素到slice里,返回修改后的slice close :关闭channel delete :从map中删除key对应的value panic  : 用于异常处理,停 ...

  3. 20155238 Java第13周课堂实践

    类定义 实验内容及要求 设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义getter和setter.定义至少三个构造方法,接收并初始化 ...

  4. 20155327 李百乾 Exp7 网络欺诈防范

    20155327 李百乾 Exp7 网络欺诈防范 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 就此次试验来看,被收到NDSspoof攻击,首先要被攻击机扫描,并被设置为目标,所 ...

  5. 执行力:Just Do It

    执行力,最最关键的一点就是,立即去做,不要想太多. 当有一件事需要去做的时候,你的大脑肯定是接受到了"某种信号",比如来了一个灵感.受到一点启发.做某件事突然来了兴趣.或者想去探讨 ...

  6. kvm虚拟化一: 图形化的管理方式

    1.安装必要工具yum install -y / qemu-kvm //kvm主程序 libvirt //虚拟化服务库 libguestfs-tools //虚拟机系统管理工具 virt-instal ...

  7. [CF1060E]Sergey and Subway[树dp]

    题意 给出 \(n\) 个点的树,求 \(\sum_{i=1}^n{\sum_{j=i}^n{\lceil \frac{dis(i,j)}{2} \rceil}}\) . \(n\leq 2 \tim ...

  8. 【分享】Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  9. 【Tableau】电商广告投放的地域分析

    分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ...

  10. DRF01

    1.web应用模式 在web开发中有两种应用模式: 1)前后端不分离 2)前后端分离 2.api接口 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范, ...