题目链接: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. 大脑进化追不上社会文化:化石和脱氧核糖核酸证明人类大脑进化比社会慢
  2. Spring Cloud中Hystrix仪表盘与Turbine集群监控
  3. git指令快捷 idea_IDEA+Git+Gitlab使用详细教程
  4. 数据模型同学看过来|代码案例实操来袭
  5. Java:批量插入、修改数据到数据库中的用法
  6. python 工作量统计_如何获得Python多处理池剩余的“工作量”?
  7. Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  8. 正好股票开户指数大跌分解比较严重
  9. Excel高级应用高频使用函数汇总
  10. java word jar包_java操作word书签生成word模板不用jar包
  11. xsmax无法进入dfu模式_iPhoneXS/XSMax如何强制重启?如何进入恢复模式或DFU模式?...
  12. 如何清理和优化你的Mac:14个小技巧推荐给你!
  13. 在美国的电子工程师眼中的中国电子行业!
  14. [ERROR] Slave I/O: error connecting to master
  15. AVUE一些简单用法——avue-crud子表单
  16. ubuntu + eigen3 安装(解决 fatal error: Eigen/Core: No such file or directory)
  17. Linux 清理 firewalld 和 iptables 所有规则
  18. flowplayer播放_在iPad上自动播放Flowplayer
  19. [骑驴找马]ETAGEERF和Agent*Go
  20. DOS命令行下输入mount命令

热门文章

  1. 已知原函数和导函数的关系_根据函数表达式该如何求函数值
  2. 学习ES6路线了解图
  3. 事业单位计算机岗位考公基吗,江苏事业单位统考考公基吗
  4. php 2个时间查询差几天,PHP怎么计算2个日期差
  5. shell 启动java程序_Shell 脚本启动java程序
  6. python中tkinter模块_使用Python中的tkinter模块作图的方法
  7. html中transition默认,CSS3中的Transition详解
  8. android 序列化传参数,Android序列化之Parcelable和Serializable的使用详解
  9. 对讲机怎么用_对讲机防水透气解决方案是怎么做的?
  10. java中设置http响应头控制浏览器禁止缓存当前文档内容