BZOJ 2754 喵星球上的点名(后缀数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2754
题意:给出n个字典串,m个询问串。输出每个询问串出现在多少个字典串中。最后输出每个字典串中含有多少个询问串。
思路:将所有字典串和所有询问串连在一起求sa和h数组。统计时对于每个询问串,设长度为len,向前向后扫一下h值大于等于len的区间。然后在这个区间中看有多少个字典串,就是这个询问串的答案,同时将这些字典串包含询问串个数加1。
int r[N],sa[N],wa[N],wb[N],wd[N],rank[N],h[N];
int cmp(int *r,int a,int b,int len)
{
return r[a]==r[b]&&r[a+len]==r[b+len];
}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
FOR0(i,m) wd[i]=0;
FOR0(i,n) wd[x[i]=r[i]]++;
FOR1(i,m-1) wd[i]+=wd[i-1];
FORL0(i,n-1) sa[--wd[x[i]]]=i;
for(j=1,p=1;p<n;j<<=1,m=p)
{
p=0;
FOR(i,n-j,n-1) y[p++]=i;
FOR0(i,n) if(sa[i]>=j) y[p++]=sa[i]-j;
FOR0(i,m) wd[i]=0;
FOR0(i,n) wd[x[i]]++;
FOR1(i,m-1) wd[i]+=wd[i-1];
FORL0(i,n-1) sa[--wd[x[y[i]]]]=y[i];
t=x;x=y;y=t;p=1;x[sa[0]]=0;
FOR1(i,n-1) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
void calHeight(int *r,int *sa,int n)
{
int i,j,k=0;
FOR1(i,n) rank[sa[i]]=i;
FOR0(i,n)
{
if(k) k--;
j=sa[rank[i]-1];
while(i+k<n&&j+k<n&&r[i+k]==r[j+k]) k++;
h[rank[i]]=k;
}
}
int b[N];
int n,m,M;
set<int> S;
set<int>::iterator it;
int c[N],d[N];
int ans[N],ans1[N];
void deal(int n)
{
int i,j,L,R,len;
for(i=1;i<=n;i++) if(d[sa[i]])
{
S.clear(); len=c[d[sa[i]]];
for(j=i;j>=2;j--) if(h[j]<len) break;
L=j;
for(j=i+1;j<=n;j++) if(h[j]<len) break;
R=j-1;
for(j=L;j<=R;j++) if(sa[j]<=M) S.insert(b[sa[j]]);
ans[d[sa[i]]]=SZ(S);
for(it=S.begin();it!=S.end();it++)
{
ans1[*it]++;
}
}
}
int main()
{
RD(n,m);
int i,j,x,y,t=10002,p=0;
FOR1(i,n)
{
RD(x);
FOR1(j,x) RD(y),r[p]=y+1,b[p++]=i;
r[p]=t++;
b[p++]=0;
RD(x);
FOR1(j,x) RD(y),r[p]=y+1,b[p++]=i;
r[p]=t++;
b[p++]=0;
}
M=p-1;
FOR1(i,m)
{
RD(x); c[i]=x;
FOR1(j,x)
{
if(j==1) d[p]=i;
RD(y),r[p]=y+1,b[p++]=i;
}
if(i<m) r[p]=t++,b[p++]=0;
}
r[p]=0;
da(r,sa,p+1,t);
calHeight(r,sa,p);
deal(p);
FOR1(i,m) PR(ans[i]);
FOR1(i,n-1) printf("%d ",ans1[i]);
PR(ans1[i]);
}
转载于:https://www.cnblogs.com/jianglangcaijin/p/3456821.html
BZOJ 2754 喵星球上的点名(后缀数组)相关推荐
- bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队
先把所有串按顺序放到一起,两个串间加非法字符隔开,求一个后缀数组. 然后对于询问,满足条件的子串在后缀数组上一定是连续一段区间. 这个区间的左右端点可以在读入的过程中二分求. 然后这个问题变成了多组询 ...
- [SCOI2012]喵星球上的点名(后缀数组+莫队+ST表)
传送门 这题是真的秀.一眼看下去感觉AC自动机很可做,第一个问比较好处理,dfs序即可搞定,可第二问有点抽象,目前对树形结构的知识点不足以支持我解决这个问题.所以舍弃AC自动机,用SA做. SA做法: ...
- [BZOJ2754][SCOI2012]喵星球上的点名 后缀数组
不科学啊...这题暴力可过...感觉所有串都是a就可以卡掉啊... 我的做法就是先把姓名串和询问串全部连在一起,并打上分隔符,并记录每个字符属于哪个串,求出SA.对于每个询问就从它所在的位置左右扫he ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
二次联通门 : BZOJ 2754: [SCOI2012]喵星球上的点名 /*BZOJ 2754: [SCOI2012]喵星球上的点名此题有N种做法...见到众dalao用各种奇怪的姿势AC此题..具 ...
- SCOI2012 喵星球上的点名 BZOJ 2754
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2246 Solved: 975 Description ...
- 喵星球上的点名(后缀自动机+dfs序+莫队)
喵星球上的点名 一道据传言有多种解法的题(不过大多是因为数据太弱过的).先用AC自动机搞了一上午,无果:看了题解,后缀自动机+莫队?正好是我最喜欢的算法之一+正在学习的算法,就这个了!然后由于广义自动 ...
- 【BZOJ2754】【SCOI2012】喵星球上的点名(后缀数组)
Description click me Solution 据说AC自动机可做?反正我使用后缀数组做的.. 把所有的串连在一起,用一个很大的数分割开来. 求出后缀数组,暴力地在height上找可以匹配 ...
- 【BZOJ2754】[SCOI2012]喵星球上的点名
[BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...
- bzoj2754【SCOI2012】喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1577 Solved: 710 [Submit][ ...
最新文章
- rsa 模数 指数转换 c语言_模数转换,你必须知道的8个经典ADC转换电路方案
- Hazelcast入门指南第2部分
- win7下的ipython没有的问题
- 互联网运营数据分析(2):转化分析
- 谷歌发布 Android 11 的第二个开发者预览版
- Android解决异常apk on device '0292bea1': Unable to open sync connection!
- linux 挂载raid_linux下做raid
- Redis入门到精通-Redis集群搭建
- uniapp实现打印PDF文件
- 投影html连接电脑,投影仪怎么连接电脑 电脑与投影仪的连接方法
- 怎么样恢复移动硬盘格式化的数据呢?
- Cradle 从工程学角度预测血管和气管的流量并研究生物
- Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
- Chrome谷歌浏览器关闭弹出Chrome版本太旧提示框
- ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
- CAD中怎么画指北针?CAD画指北针教程
- 【DVB】采用DVB-T或DVB-T2的国家达166个
- 【C语言】C语言中赋值语句规则
- 基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis)
- WheelTec ROS 机器人小车 ROS2 编码编译解决
热门文章
- element form 变 table
- c语言编程发展史详细介绍,一张图让你了解编程语言发展史
- Java 针对每个人安装的位置不同的情况 从快捷方式中获取到安装位置 运行谷歌浏览器
- matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院
- 使用R的金融统计:收益、随机行走和模拟
- linux设置进程不忽略信号,Linux下后台进程编写中屏蔽信号
- poatman32位下载_Postman.dll下载|Postman.dll下载官方版【32位|64位】-太平洋下载中心...
- birt脚本for循环语句_Python入门第7课,循环结构学习,for语句range函数的3种用法
- python 类可以调用实例变量_Python实例方法、类方法、静态方法区别详解
- “21天好习惯“第一期-2