题目链接: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. SimpleDateFormat

    范例: Date date = new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd,E,HH. ...

  2. ios 5

    1.屏幕尺寸568×2/320×2  需要一张568h@2x.png的图片. 2.iOS5不支持udid,用uuid替代,取得uuid方法: -(NSString*) uuid { CFUUIDRef ...

  3. 由浅入深了解Thrift之客户端连接池化

    一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...

  4. CodeForces 1B Spreadsheets (字符串处理,注意细节,大胆尝试)

    题目 注意模后余数为0时,要把除以26后的新数据减1,为什么这样,要靠大胆尝试.我在对小比赛中坑了一下午啊,直到比赛结束也没写出这道题....要死了.. #include<stdio.h> ...

  5. HDU 1163 Eddy's digital Roots(模)

    HDU 1163 题意简单,求n^n的(1)各数位的和,一旦和大于9,和再重复步骤(1),直到和小于10. //方法一:就是求模9的余数嘛! (228) leizh007 2012-03-26 21: ...

  6. Android线程消息通信(二)

    创建线程消息队列 Android应用程序的消息队列是使用一个MessageQueue对象来描述的,它可以通过调用Looper类的静态成员函数prepareMainLooper或者prepare来创建, ...

  7. Android 中建立一个OpenGL ES的开发环境

    转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...

  8. (一)初探HTML!

    想自己动手做一个个人网站,因此,最近在自学PHP,主要看韩顺平老师的教学视频..将自己学习的点点滴滴记录在博客园,希望数月之后,自己可以熟练的运用PHP,也希望各位PHP高手们给予指点,不胜感激!! ...

  9. Windows SEH学习 x86

    windows 提供的异常处理机制实际上只是一个简单的框架.我们通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处理机制上进行加工了的增强版本.这里先抛 ...

  10. 使用git整体流程

    一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交mer ...