题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691

题意:给出Input,求出Compressed output。输出各用多少字节。

思路:求后缀数组。每次直接询问两个后缀的最长公共前缀。

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 f[N][20],n;

void init()
{
    int i,j;
    FOR1(i,n) f[i][0]=h[i];
    for(i=1;1+(1<<i)<=n;i++) for(j=1;j+(1<<i)-1<=n;j++)
    {
        f[j][i]=min(f[j][i-1],f[j+(1<<(i-1))][i-1]);
    }
}

int cal(int a,int b)
{
    if(a==b) return n-a;
    a=rank[a];
    b=rank[b];
    if(a>b) swap(a,b);
    a++;
    int m=floor(log(1.0*(b-a+1))/log(2.0));
    return min(f[a][m],f[b-(1<<m)+1][m]);
}

char s[N];

int getBit(int x)
{
    if(x<10) return 1;
    int ans=0;
    while(x) ans++,x/=10;
    return ans;
}

void deal()
{
    i64 ans1=0,ans2=0;
    int preL,preR,L,R;
    int m,k;
    RD(m);
    RD(preL,preR);
    ans1=preR-preL+1;
    ans2=preR-preL+3;
    m--;
    while(m--)
    {
        RD(L,R);
        k=min(min(R-L,preR-preL),cal(L,preL));
        ans1+=R-L+1;
        ans2+=getBit(k)+1+R-L-k+1;
        preL=L;
        preR=R;
    }
    printf("%I64d %I64d\n",ans1,ans2);
}

int main()
{
    while(scanf("%s",s)!=-1)
    {
        n=strlen(s);
        int i;
        FOR0(i,n) r[i]=s[i];
        r[n]=0;
        da(r,sa,n+1,130);
        calHeight(r,sa,n);
        init();
        deal();
    }
}

HDU 4691 Front compression(后缀数组)的更多相关文章

  1. hdu 4691 Front compression (后缀数组)

    hdu 4691 Front compression 题意:很简单的,就是给一个字符串,然后给出n个区间,输出两个ans,一个是所有区间的长度和,另一个是区间i跟区间i-1的最长公共前缀的长度的数值的 ...

  2. HDU-4691 Front compression 后缀数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691 后缀数组模板题,求出Height数组后,对Height做RMQ,然后直接统计就可以了... // ...

  3. HDU 4691 Front compression (2013多校9 1006题 后缀数组)

    Front compression Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Othe ...

  4. hdu4691 Front compression(后缀数组)

    Front compression Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) ...

  5. HDU 4691 正解后缀数组(暴力也能过)

    本来是个后缀数组,考察算法的中级题目,暴力居然也可以水过,就看你跳不跳坑了(c++和G++返回结果就很不一样,关键看编译器) 丝毫不差的代码,就看运气如何了.唯一差别c++还是G++,但正解是后缀数组 ...

  6. hdu 4691 Front compression

    暴力水过,剪一下枝= =果断是数据水了 #include<cstdio> #include<cstring> #include<algorithm> #define ...

  7. 【HDOJ】4691 Front compression

    后缀数组基础题目,dc3解. /* 4691 */ #include <iostream> #include <sstream> #include <string> ...

  8. hdu 5442 Favorite Donut 后缀数组

    Favorite Donut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...

  9. hdu 4622 Reincarnation(后缀数组)

    hdu 4622 Reincarnation 题意:还是比较容易理解,给出一个字符串,最长2000,q个询问,每次询问[l,r]区间内有多少个不同的字串. (为了与论文解释统一,这里解题思路里sa数组 ...

随机推荐

  1. 【POJ】【1637】Sightseeing tour

    网络流/最大流 愚人节快乐XD 这题是给一个混合图(既有有向边又有无向边),让你判断是否有欧拉回路…… 我们知道如果一个[连通]图中每个节点都满足[入度=出度]那么就一定有欧拉回路…… 那么每条边都可 ...

  2. 一个包的libevent流程

    //一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { Send ...

  3. yii无限极分类

    /** * 获取菜单Tree * * @return multitype: */ public function getMenuAllList() { $resArr = $this->getT ...

  4. vitrualbox虚拟机64位安装报错解决

    1 NtCreateFile(\Device\VBoxDrvStub) failed: 0xc0000034 STATUS_OBJECT_NAME_NOT_FOUND (0 retries) 解决办法 ...

  5. 常量折叠 const folding

    http://bbs.byr.cn/#!article/CPP/86336?p=1 下列代码给出输出结果: #include"stdafx.h" #include <iost ...

  6. 【JQuery NoviceToNinja系列】目录

    [JQuery NoviceToNinja系列]目录 [JQuery NoviceToNinja系列]01 开篇 Html页面设计和布局

  7. 关于Web与JS

    Web包含的范围比较广, JS只是代码逻辑而已. Web比如HTTP Message, SOAP Message, 浏览器流程,工具等. 不仅仅是代码.

  8. JS数据类型的理解(猜测)

    Js 数据类型 对于这个主题,首先来看几个问题,如果你对这几个问题很清楚的话,那就请直接跳过吧,不用接着往下看了,如果不清楚,建议你还是看看. 1)如果判断函数?function 和object的联系 ...

  9. jquery json遍历和动态绑定事件

    <div id='tmpselectorList' style='border: 1px solid grey;max-height: 150px;position:absolute;text- ...

  10. LCA(最近公共祖先)离线算法Tarjan+并查集

    本文来自:http://www.cnblogs.com/Findxiaoxun/p/3428516.html 写得很好,一看就懂了. 在这里就复制了一份. LCA问题: 给出一棵有根树T,对于任意两个 ...