不科学啊。。。这题暴力可过。。。感觉所有串都是a就可以卡掉啊。。。
我的做法就是先把姓名串和询问串全部连在一起,并打上分隔符,并记录每个字符属于哪个串,求出SA。对于每个询问就从它所在的位置左右扫height

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
const int maxn=100010;
const int maxs=300010;
int n,m,s[maxs],bg[maxn],len[maxn],id[maxs],top=0,sa[maxs],rk[maxs],hei[maxs],x[maxs],y[maxs],buc[maxs],usd[maxs],ans[maxn];
void getss(int v,int f)
{scanf("%d",&len[v]);bg[v]=top+1;for(int i=1;i<=len[v];i++) {scanf("%d",&s[++top]);id[top]=f*(v+1)/2;}s[++top]=10001;
}
void getsa()
{int m=10010;memset(buc,0,sizeof(buc));for(int i=1;i<=top;i++) buc[x[i]=s[i]]++;for(int i=1;i<=m;i++) buc[i]+=buc[i-1];for(int i=top;i>=1;i--) sa[buc[x[i]]--]=i;for(int k=1;k<=top;k<<=1){int p=0;for(int i=top;i>top-k;i--) y[++p]=i;for(int i=1;i<=top;i++) if(sa[i]>k) y[++p]=sa[i]-k;for(int i=0;i<=m;i++) buc[i]=0;for(int i=1;i<=top;i++) buc[x[y[i]]]++;for(int i=1;i<=m;i++) buc[i]+=buc[i-1];for(int i=top;i>=1;i--) sa[buc[x[y[i]]]--]=y[i];    swap(x,y);p=1;x[sa[1]]=1;for(int i=2;i<=top;i++)if(y[sa[i-1]]==y[sa[i]]&&sa[i-1]+k<=top&&sa[i]+k<=top&&y[sa[i-1]+k]==y[sa[i]+k]) x[sa[i]]=p;else x[sa[i]]=++p;  if(p>=top) break;m=p;    }for(int i=1;i<=top;i++) rk[sa[i]]=i;for(int i=1,k=0;i<=top;i++){if(rk[i]==1) {hei[1]=0;continue;}k=max(k-1,0);for(int j=sa[rk[i]-1];s[i+k]==s[j+k]&&i+k<=top&&j+k<=top;k++);hei[rk[i]]=k;}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)getss(2*i-1,1),getss(2*i,1);for(int i=1;i<=m;i++)getss(2*n+i,0);     getsa();for(int i=1;i<=m;i++){int tot=0;for(int j=rk[bg[2*n+i]];hei[j]>=len[2*n+i];j--) if(id[sa[j-1]]>0) usd[++tot]=id[sa[j-1]];for(int j=rk[bg[2*n+i]]+1;hei[j]>=len[2*n+i];j++) if(id[sa[j]]>0) usd[++tot]=id[sa[j]];sort(usd+1,usd+tot+1);int sz=unique(usd+1,usd+tot+1)-usd-1;printf("%d\n",sz);for(int j=1;j<=sz;j++)ans[usd[j]]++;}for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}

[BZOJ2754][SCOI2012]喵星球上的点名 后缀数组相关推荐

  1. bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队

    先把所有串按顺序放到一起,两个串间加非法字符隔开,求一个后缀数组. 然后对于询问,满足条件的子串在后缀数组上一定是连续一段区间. 这个区间的左右端点可以在读入的过程中二分求. 然后这个问题变成了多组询 ...

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

    传送门 这题是真的秀.一眼看下去感觉AC自动机很可做,第一个问比较好处理,dfs序即可搞定,可第二问有点抽象,目前对树形结构的知识点不足以支持我解决这个问题.所以舍弃AC自动机,用SA做. SA做法: ...

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

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

  4. [BZOJ2754][SCOI2012]喵星球上的点名(后缀数组+莫队)

    Address 洛谷P2336 BZOJ2754 LOJ#2374 Solution 考虑在每个人的姓和名之间插入一个无关的字符. 这样问题就转化成了一些主串和一些模式串,询问每个模式串能匹配到多少个 ...

  5. [BZOJ2754]-[SCOI2012]喵星球上的点名-AC自动机+树状数组

    说在前面 感觉这题还是挺经典的 所以还是写了记录一下- 题目 BZOJ2754传送门 洛谷P2336传送门 看题可进传送门 题目-略长,概括起来有点麻烦 解法 读完这道题之后,可以发现实际上它就是要我 ...

  6. 洛谷2336 BZOJ2754 SCOI2012 喵星球上的点名 SA 莫队 二分

    题目链接 题意: 有nnn个人,每个人有两个串,一个表示姓,一个表示名,这里用数字表示字符.有mmm次询问,对于每次询问,你要回答有多少个人的姓或者名至少有一个是给出的串的子串.最后再对于这nnn个人 ...

  7. bzoj2754: [SCOI2012]喵星球上的点名

    传送门 事实证明,我肉眼debug了两个晚上,还是不及对拍效率高. AC自动机写错了都毫不自觉的智障宸 因为数据水,写的暴力 //Achen #include<algorithm> #in ...

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

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

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

    二次联通门 : BZOJ 2754: [SCOI2012]喵星球上的点名 /*BZOJ 2754: [SCOI2012]喵星球上的点名此题有N种做法...见到众dalao用各种奇怪的姿势AC此题..具 ...

最新文章

  1. C++逐行读取文本文件的正确做法
  2. python 代码生成器 oc_iOS 移动端生成工具开发
  3. 清华、北大、浙大的计算机课程资源集都在这里
  4. 搜索日志文件的linux,linux日志查找
  5. java是一种,java是一种编译程序吗
  6. 【NOIP2017】【Luogu3955】图书管理员(枚举,取模得后缀)
  7. java解析未知key json_获取JsonObject某一未知key的值操作
  8. 关于查看网页源文件不显示源代码(打开的是桌面文件夹)的问题
  9. rsync 全网备份企业案例
  10. xp 无法关闭计算机,电脑xp系统关不了机怎么解决
  11. 海康威视摄像机html5播放rtsp方案
  12. android开源库汇总
  13. 爬取百度迁徙2021年春运迁徙数据(仅省份级别)
  14. java itext read a pdf file_java - 使用iText7读取PDF时遇到的问题(使用iText5) - 堆栈内存溢出...
  15. 两种方法删除顽固的DLL文件
  16. 计算机网络的分类 ppt,《计算机网络》PPT课件.ppt
  17. 千元平板乐Pad A1完整拆解视频
  18. 程序员,要不要考软考高级职称?
  19. 机器学习之sklearn-KNN近邻算法分类小案例(乳腺癌预测最优模型)
  20. 语音增强 理论与实践 pdf_初中英语语音教学策略研究 (结题报告)

热门文章

  1. android 输入法如何启动流程_Android输入法显示流程
  2. 《数据挖掘导论》- 读书笔记(3)- 数据
  3. 计算机科学导论论文文章,计算机科学导论论文(2)
  4. Dialogue Summarization with Supporting Utterance Flow Modeling and Fact Regularization阅读笔记
  5. 电脑连接多台Andro设备使用adb命令进行无线调试
  6. mysql js 命令行登录_MYSQL常用命令
  7. android获取用户手机信息,Android – 使用AccountManager /手机所有者的姓氏和姓氏获取用户数据...
  8. 编程方式操作WorkFlow
  9. qpython3h教程_Python3实现AI五子棋【初版】|python3教程|python入门|python教程
  10. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法解析 荒岛求生资源怎么获得...