题目链接: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 喵星球上的点名(后缀数组)相关推荐

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

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

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

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

  3. [BZOJ2754][SCOI2012]喵星球上的点名 后缀数组

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

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

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

  5. SCOI2012 喵星球上的点名 BZOJ 2754

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2246 Solved: 975 Description ...

  6. 喵星球上的点名(后缀自动机+dfs序+莫队)

    喵星球上的点名 一道据传言有多种解法的题(不过大多是因为数据太弱过的).先用AC自动机搞了一上午,无果:看了题解,后缀自动机+莫队?正好是我最喜欢的算法之一+正在学习的算法,就这个了!然后由于广义自动 ...

  7. 【BZOJ2754】【SCOI2012】喵星球上的点名(后缀数组)

    Description click me Solution 据说AC自动机可做?反正我使用后缀数组做的.. 把所有的串连在一起,用一个很大的数分割开来. 求出后缀数组,暴力地在height上找可以匹配 ...

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

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

  9. bzoj2754【SCOI2012】喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1577  Solved: 710 [Submit][ ...

最新文章

  1. rsa 模数 指数转换 c语言_模数转换,你必须知道的8个经典ADC转换电路方案
  2. Hazelcast入门指南第2部分
  3. win7下的ipython没有的问题
  4. 互联网运营数据分析(2):转化分析
  5. 谷歌发布 Android 11 的第二个开发者预览版
  6. Android解决异常apk on device '0292bea1': Unable to open sync connection!
  7. linux 挂载raid_linux下做raid
  8. Redis入门到精通-Redis集群搭建
  9. uniapp实现打印PDF文件
  10. 投影html连接电脑,投影仪怎么连接电脑 电脑与投影仪的连接方法
  11. 怎么样恢复移动硬盘格式化的数据呢?
  12. Cradle 从工程学角度预测血管和气管的流量并研究生物
  13. Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
  14. Chrome谷歌浏览器关闭弹出Chrome版本太旧提示框
  15. ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
  16. CAD中怎么画指北针?CAD画指北针教程
  17. 【DVB】采用DVB-T或DVB-T2的国家达166个
  18. 【C语言】C语言中赋值语句规则
  19. 基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis)
  20. WheelTec ROS 机器人小车 ROS2 编码编译解决

热门文章

  1. element form 变 table
  2. c语言编程发展史详细介绍,一张图让你了解编程语言发展史
  3. Java 针对每个人安装的位置不同的情况 从快捷方式中获取到安装位置 运行谷歌浏览器
  4. matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院
  5. 使用R的金融统计:收益、随机行走和模拟
  6. linux设置进程不忽略信号,Linux下后台进程编写中屏蔽信号
  7. poatman32位下载_Postman.dll下载|Postman.dll下载官方版【32位|64位】-太平洋下载中心...
  8. birt脚本for循环语句_Python入门第7课,循环结构学习,for语句range函数的3种用法
  9. python 类可以调用实例变量_Python实例方法、类方法、静态方法区别详解
  10. “21天好习惯“第一期-2