后缀数组的简单题吧。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=100000+10;
 6 char s[maxn];
 7 int sa[maxn],t[maxn],t2[maxn],c[maxn];
 8 int rank[maxn],height[maxn];
 9 int d[maxn][50];
10 void build_sa(int n,int m)
11 {
12     int i,*x=t,*y=t2;
13     for(i=0;i<m;i++) c[i]=0;
14     for(i=0;i<n;i++) c[x[i]=s[i]]++;
15     for(i=1;i<m;i++) c[i]+=c[i-1];
16     for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
17
18     for(int k=1;k<=n;k<<=1)
19     {
20         int p=0;
21         for(int j=n-k;j<n;j++) y[p++]=j;
22         for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
23
24         for(i=0;i<m;i++) c[i]=0;
25         for(i=0;i<n;i++) c[x[y[i]]]++;
26         for(i=1;i<m;i++) c[i]+=c[i-1];
27         for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
28
29         swap(x,y);
30         x[sa[0]]=0;
31         p=1;
32         for(i=1;i<n;i++)
33         x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
34         if(p>=n) break;
35         m=p;
36     }
37 }
38 void getHeight(int n)
39 {
40     int i,k=0;
41     for(i=1;i<=n;i++) rank[sa[i]]=i;
42     for(i=0;i<n;i++)
43     {
44         if(k) k--;
45         int j=sa[rank[i]-1];
46         while(s[i+k]==s[j+k]) k++;
47         height[rank[i]]=k;
48     }
49 }
50 int rmq(int a,int b)
51 {
52     a=rank[a],b=rank[b];
53     if(a>b) swap(a,b);
54     a++;
55     int k=0;
56     while((1<<(k+1))<=b-a+1)k++;
57     return min(d[a][k],d[b-(1<<k)+1][k]);
58 }
59 int main()
60 {
61     while(scanf("%s",s)!=EOF)
62     {
63         int n=strlen(s);
64         build_sa(n+1,128);
65         getHeight(n);
66         for(int i=1;i<=n;i++) d[i][0]=height[i];
67         for(int j=1;(1<<j)<=n;j++)
68             for(int i=1;i+(1<<j)-1<=n;i++)
69              d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
70         int m,a,b,x,y;
71         scanf("%d",&m);
72         long long orgin=0,compress=0;
73         scanf("%d%d",&x,&y);
74         orgin+=(y-x+1);
75         compress+=(y-x+3);
76         m--;
77         while(m--)
78         {
79             scanf("%d%d",&a,&b);
80             orgin+=(b-a+1);
81             int tmp;
82             if(a!=x)
83              tmp=rmq(a,x);
84             else
85              tmp=min(b-a,y-x);
86             tmp=min(min(tmp,y-x),b-a);
87             int tmp2=tmp,cnt=0;
88             while(tmp2){tmp2/=10;cnt++;}
89             if(!cnt) cnt++;
90             compress+=(b-a+1+cnt+1-tmp);
91             x=a;y=b;
92         }
93         printf("%I64d %I64d\n",orgin,compress);
94     }
95     return 0;
96 }

转载于:https://www.cnblogs.com/sooflow/p/3402095.html

hdu 4691 Front compression相关推荐

  1. HDOJ 4691 Front compression 后缀数组

    后缀数组求两子串间的最大公共前缀. Front compression Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 102400/1 ...

  2. 【HDU4691】【后缀数组】Front compression 题解

    Front compression 翻译见后 Description Front compression is a type of delta encoding compression algorit ...

  3. idea mysql 创建表_idea 根据数据库表自动创建持久化类

    TODO:Go语言goroutine和channel使用 TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管 ...

  4. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  5. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  6. 【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)

    最短路径问题是图论中很重要的问题. 解决最短路径几个经典的算法 1.Dijkstra算法 单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法. 2.bell ...

  7. HDU - 5637 Transform (思维、bfs预处理)

    HDU - 5637 题目大意: 给出n个数的序列a,对于一个整数x,有两种操作: 1.改变x二进制中任一位 2.将x变为x^a[i] m次查询,每次查询输入两个整数x和y,问x最少经过多少次操作可以 ...

  8. R - 0 or 1 HDU - 4370

    R - 0 or 1 HDU - 4370 题意: 给你一个邻接矩阵,让你求出从满足条件的答案, 条件如下: 1 的出度为 1, 入度不一定 n 的入度为 1, 出度不一定 其余点的 出度 == 入度 ...

  9. N - Find a way HDU - 2612

    N - Find a way HDU - 2612 首先的想法是找到他们俩到每个 KFC 的最小距离,然后让和最小即可 那么怎么求他们俩到 KFC 的最小距离呢,可以从 KFC 出发去找他俩,也可以从 ...

最新文章

  1. 计算机视觉工程师必读经典图书推荐
  2. Android自定义控件入门实践之雷达扫描控件
  3. Eclipse导入Elasticsearch源码
  4. .net mysql 多线程_.net线程详解(转)
  5. SuseLinux详解(2)——网络设置静态IP 网关 DNS的方法
  6. 安卓数据库的使用方式
  7. 使用画图软件gunplot出现的问题和解决办法
  8. mac使用之必备神器
  9. ORBSLAM3 的改进
  10. CSS相对定位和绝对定位
  11. Word章节自动编号+公式编号
  12. 使用TimerOne库
  13. 好莱坞大片! 为躲避死亡威胁, 只用15步, 这个密码朋克大叔就从世界消失了......
  14. 文件不见还占用空间咋修复
  15. 教你怎么批量查询快递单号,一学就会
  16. 基本数据结构——线性结构(列表/无序表)
  17. 报错:attributes are not compatible with the provided attributes
  18. matlab中文乱码问题
  19. 计算机语言space什么意思,space是什么意思
  20. iTunes 4.9播客

热门文章

  1. Spring Data —— 完全统一的API?
  2. 2012.02.13(rtsp)
  3. JScript中正则表达函数的说明与应用
  4. 蓄电池内阻测试仪分析软件,蓄电池内阻测试仪(GCBT-8610)
  5. 让组件悬浮所有页面之上
  6. java(17) - 增强for循环、装箱拆箱、可变参数
  7. 华为服务器通过mgmt口挂载光盘装系统及Linux系统rescue模式下修复内核
  8. 在多模块开发的时候,利用项目继承可以将结构信息、部署信息,将共同的依赖放在一个父类中。...
  9. 浅谈ThreadPool 线程池
  10. 6月第4周全球域名注册商(国际域名)新增注册量TOP22