HDU 4691 后缀数组+RMQ
思路:
求一发后缀数组,求个LCP 就好了
注意数字有可能不只一位 (样例2)
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
char s[N];
int cntA[N],cntB[N],A[N],B[N],sa[N],rk[N],tsa[N],ht[N],f[N][];
int n,t,base[N],l[N],r[N];
void SA(){
for(int i=;i<=;i++)cntA[i]=;
for(int i=;i<=n;i++)cntA[s[i]]++;
for(int i=;i<=;i++)cntA[i]+=cntA[i-];
for(int i=n;i;i--)sa[cntA[s[i]]--]=i;
rk[sa[]]=;
for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(s[sa[i]]!=s[sa[i-]]);
for(int l=;rk[sa[n]]<n;l<<=){
memset(cntA,,sizeof(cntA));
memset(cntB,,sizeof(cntB));
for(int i=;i<=n;i++)cntA[A[i]=rk[i]]++,cntB[B[i]=(i+l<=n?rk[i+l]:)]++;
for(int i=;i<=n;i++)cntA[i]+=cntA[i-],cntB[i]+=cntB[i-];
for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
rk[sa[]]=;
for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(A[sa[i]]!=A[sa[i-]]||B[sa[i]]!=B[sa[i-]]);
}
for(int i=,j=;i<=n;i++){
j=j?j-:;
while(s[i+j]==s[sa[rk[i]-]+j])j++;
ht[rk[i]]=j;
}
}
void init_rmq(){
base[]=-;
for(int i=;i<=n;i++)f[i][]=ht[i],base[i]=base[i>>]+;
for(int j=;j<=;j++)
for(int i=;i+(<<(j-))<=n;i++)
f[i][j]=min(f[i][j-],f[i+(<<(j-))][j-]);
}
int LCP(int x,int y){
if(x==y)return n-x+;
x=rk[x],y=rk[y];
if(x>y)swap(x,y);x++;
int t=base[y-x+];
return min(f[x][t],f[y-(<<t)+][t]);
}
int main(){
while(~scanf("%s",s+)){
long long ans=;n=strlen(s+);
SA(),init_rmq();
scanf("%d",&t);
for(int i=;i<=t;i++)scanf("%d%d",&l[i],&r[i]),ans+=r[i]-l[i]+,l[i]++;
printf("%lld ",ans);
for(int i=;i<=t;i++){
int tmp=min(LCP(l[i-],l[i]),min(r[i]-l[i],r[i-]-l[i-])+);
ans+=(tmp?(int)log10(tmp):)-tmp;
}
printf("%lld\n",ans+t*);
}
}
HDU 4691 后缀数组+RMQ的更多相关文章
- hdu 2459 (后缀数组+RMQ)
题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...
- hdu 3948(后缀数组+RMQ)
题意:求一个串中有多少不同的回文串. 分析:这一题的关键是如何去重,我表示我现在还没理解为什么这样去重,先放这里过两天再看!! //不同回文子串数目 #include <iostream> ...
- hdu 3948 后缀数组
The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (J ...
- 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过
题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&am ...
- POJ 3693 后缀数组+RMQ
思路: 论文题 后缀数组&RMQ 有一些题解写得很繁 //By SiriusRen #include <cmath> #include <cstdio> #includ ...
- spoj687 REPEATS - Repeats (后缀数组+rmq)
A string s is called an (k,l)-repeat if s is obtained by concatenating k>=1 times some seed strin ...
- HDU 6194 string string string(后缀数组+RMQ)
string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU - 3948 后缀数组+Manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3948 题意:给定一个字符串,求字符串本质不同的回文子串个数. 思路:主要参考该篇解题报告 先按照man ...
- HDU2459 后缀数组+RMQ
题目大意: 在原串中找到一个拥有连续相同子串最多的那个子串 比如dababababc中的abababab有4个连续的ab,是最多的 如果有同样多的输出字典序最小的那个 这里用后缀数组解决问题: 枚举连 ...
随机推荐
- cogs——1001. [WZOI2011 S3] 消息传递
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- Spring基础入门(三)
一.Spring的jdbcTemplate操作 (1)Spring是一站式框架,对于javaee三层,每一层都有解决技术. web层:springMVC service:spring的ioc dao层 ...
- Ubuntu 16.04安装TortoiseSVN(基于CrossOver)
基于CrossOver的TortoiseSVN有如下缺点: 1.不能像Windows下实现右键菜单提交,但是可以通过TortoiseSVN实现迁出代码. 可以解决的问题: 1.可以通过Tortoise ...
- list去掉重复元素
需求: 有list 里面含有重复元素,要求去掉重复元素: solution 1: >>> a [1, 2, 2, 1, 3, 4, 5, 6, 5] >>> set ...
- delphi调用oracle存储过程(ODAC)
CREATE OR REPLACE PACKAGE p_lee01ISTYPE cur_lee01 IS REF CURSOR;END; CREATE OR REPLACE PROCEDURE pro ...
- SAS编程基础 - 逻辑库和数据集
1. SAS逻辑库 1.1 创建SAS逻辑库: libname lb 'F:\Data_Model'; libname是关键字,lb是创建的逻辑库的名称,引号内的内容是目录路径,最后一个分号结束程序语 ...
- C++之类的比較运算符的重载
比較运算符的重载通常有两种方式: 第一:作为成员函数重载 曾经几章的Student类为例: <span style="font-family:Microsoft YaHei;font- ...
- 【Nginx】负载均衡-IP哈希策略剖析
转自:江南烟雨 IP哈希初始化 IP哈希的初始化函数ngx_http_upstream_init_ip_hash(ngx_http_upstream_ip_hash_module.c): static ...
- CCNA一些要点
考试范围: TK640-801(Cisco Certified Network Associate 640-801 ICND Course Notes). 信息单位: 1Byt ...
- C#如何设置窗体不能修改大小
找到FormBorderStyle设置为FixedDialog即可