题目链接: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]);
}

BZOJ 2754 喵星球上的点名(后缀数组)的更多相关文章

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

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

  2. BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组

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

  3. 【BZOJ 2754 喵星球上的点名】

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

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

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

  5. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

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

  6. BZOJ 2754 【SCOI2012】 喵星球上的点名

    题目链接:喵星球上的点名 首先可以发现姓和名两个串就是逗你玩的.在两个串中间插入一个\(10001\),当成一个串做就可以了. 于是我们的问题转化为了: 有\(n\)个串\(A_1,A_2,\dots ...

  7. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  8. P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)

    P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...

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

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

随机推荐

  1. [原] blade中C++ singleton的实现

    最近看了龚大大KalyGE中的singleton, 觉得非常不错(C++中线程安全并且高效的singleton). 可惜blade的代码都是C++03的, 没有使用C++11的任何特性. 笔者对于si ...

  2. PHP命令行模式基本介绍

      首先要保证php在cli模式下可用,php –v会返回PHP的版本号. [gaojian3@log001 ~]$ php -v PHP (cli) (built: Aug ::) Copyrigh ...

  3. The life of an HTML HTTP request

    https://developer.mozilla.org/en-US/docs/The_life_of_an_HTML_HTTP_request http://www.html5rocks.com/ ...

  4. HDOJ 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. asp.net 处理流程

    原文:http://www.cnblogs.com/wupeiqi/archive/2013/03/03/2941295.html 工作进程: 在iis中,工作进程(w3wp.exe)运行着asp.n ...

  6. winform中的时间轴控件

    我现在做的项目遇到一个需求,就是有没有类似的控件: 我要实现的功能是:播放录像. 某个时间段内假如有2个录像,这个坐标表示的是时间,假如我现在拖动时间轴,拖到第一个录像里面开始播放第一个录像,拖到2个 ...

  7. JavaScript语言基础知识点图示(转)

    一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...

  8. android开发环境搭建(for 驱动开发人员)

    前言 一.android驱动的开发流程 1: 写LINUX驱动 2: 写LINUX应用测试程序 3: 写JNI接口,用来包装第二步写的应用 (要用NDK来编译) 生成一个.SO文件,相当于CE下的DL ...

  9. 在Vista或Windows 7系统上安装Sharepoint 2007

    在Vista或Windows 7系统上安装Sharepoint 2007 2010-03-05 18:53:19|  分类: 技术文章|字号 订阅     SharePoint 2007 不能直接安装 ...

  10. Badboy录制

    摘要 Badboy是一个强大的工具,被设计用于测试和开发复杂的动态应用.Badboy功能丰富(包括一个捕获/重播接口,强大的压力测试支持,详细的报告.图形)使得测试和开发更加容易. Badboy是用来 ...