HDU 3856 Palindrome ( Manacher + RMQ + 二分 ) WA!!!
不知道错在哪了,求大神指教!!!
思路:用manacher求出每个以str[i]为中心轴的回文串的长度,RMQ预处理区间最大值,对于每个查询,二分最大回文串长,判定是否可行。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ; char str[ MAXN ];
int data[ MAXN * ];
int p[ MAXN * ];
int d[ MAXN * ][];
int n, len; void init()
{
int id,MaxL,MaxId;
int i;
MaxL=MaxId=;
len = strlen(&str[]);
for (i=; i <= len; i++)
{
data[(i<<)]=str[i];
data[(i<<)+]=;
}
data[]=;
data[]=;
n=(i<<)+;
data[n]=;
MaxId=MaxL=;
p[] = ;
for (i=; i<n; i++)
{
if (MaxId>i)
p[i]=min(p[*id-i],MaxId-i);
else
p[i]=;
while (data[i+p[i]] == data[i-p[i]])
p[i]++;
if (p[i]+i>MaxId)
MaxId=p[i]+i,id=i;
//printf( "p[%d]=%d\n", i, p[i] );
}
for ( i = ; i < n; ++i ) --p[i]; return;
} void RMQinit()
{
for ( int i = ; i <= n; ++i ) d[i][] = p[i];
for ( int j = ; ( << j ) <= n; ++j )
for ( int i = ; i + j - <= n; ++i )
d[i][j] = max( d[i][j - ], d[ i + (<<(j-))][j - ] );
return;
} int RMQquery( int L, int R )
{
int k = ;
while ( ( << (k + )) <= R - L + ) ++k;
return max( d[L][k], d[ R - ( << k ) + ][k] );
} bool check( int L, int R, int mid )
{
//if ( L + mid > R - mid ) return false;
int ans = RMQquery( L + mid, R - mid );
//printf("[%d %d]:%d\n", L + mid, R - mid, ans );
//printf("ans = %d, mid = %d\n", ans, mid );
if ( ans >= mid )
{
//puts("****");
return true;
}
return false;
} int BiSearch( int l, int r, int L, int R )
{
int ans = ;
while ( l <= r )
{
int mid = ( l + r ) >> ;
if ( check( L, R, mid ) )
{
l = mid + ;
ans = mid;
}
else r = mid - ;
}
return ans;
} int main()
{
int T;
scanf( "%d", &T );
getchar();
while ( T-- )
{
memset( d, , sizeof(d) );
memset( p, , sizeof(p) );
gets( &str[] );
init();
RMQinit(); int Q;
scanf( "%d", &Q );
while ( Q-- )
{
int a, b;
scanf( "%d%d", &a, &b );
if ( a < ) a = ;
if ( b > len ) b = len;
if ( a > len )
{
puts("");
continue;
}
if ( a > b ) swap( a, b );
int ans = BiSearch( , b - a + , a* - , b* + );
printf( "%d\n", ans );
}
getchar();
}
return ;
}
HDU 3856 Palindrome ( Manacher + RMQ + 二分 ) WA!!!的更多相关文章
- HDU 5089 Assignment(rmq+二分 或 单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5726 GCD(RMQ+二分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...
- HDU 6230 Palindrome ( Manacher && 树状数组)
题意 : 给定一个字符串S,问你有多少长度为 n 的子串满足 S[i]=S[2n−i]=S[2n+i−2] (1≤i≤n) 参考自 ==> 博客 分析 : 可以看出满足题目要求的特殊回文子串其 ...
- hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 ...
- hdu 3486 Interviewe (RMQ+二分)
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- *HDU3486 RMQ+二分
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 1159 Palindrome(回文串) 动态规划
题意:输入一个字符串,至少插入几个字符可以变成回文串(左右对称的字符串) 分析:f[x][y]代表x与y个字符间至少插入f[x][y]个字符可以变成回文串,可以利用动态规划的思想,求解 状态转化方程: ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- redis string类型
- mac jdk profile 永久的配置
配置java_home 在MAC中设置JAVA_HOME环境变量 环境变量要再etc目录下的profile文件中配置,这样才是永久的配置. cd /etc vi profile 按 i 键进入写模式 ...
- maven没有servlet(创建servlet后报错)
maven不能创建servlet 解决方案 方案一 在项目的iml进行指定根目录 <sourceRoots> <root url="file://$MODULE_DIR$/ ...
- System.Web.UI.HtmlControls
用来创建一个标签.HtmlContainerControl 一般用此类来新建标签. 可能我们熟悉System.Web.UI.WebControls;空间.System.Web.UI.WebContro ...
- 在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用
首先看C3p0这个连接池,最大优势可以自动读取默认的配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- Spring Cloud 入门Eureka -Consumer服务消费(Ribbon)(二)
前面一篇介绍了LoadBalancerClient来实现负载均衡, 这里介绍Spring cloud ribbon 1.ribbon Spring Cloud Ribbon 是一个基于Http和TCP ...
- Windows Subsystem for Linux(WSL)安装记录
什么是WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canoni ...
- 微信网页授权access_token与基础支持的access_token
问题1:网页授权access_token与分享的jssdk中的access_token一样吗? 答:不一样.网页授权access_token 是一次性的,而基础支持的access_token的是有时间 ...
- 课时27.base(掌握)
base标签就是专门用来统一的指定当前网页中所有的超链接(a标签)需要如何打开 格式 <base target="_blank"> <a href="h ...
- Python__for循环和列表生成式的区别
话不多,上例子 >>> L = [,,] >>> for i in range(len(L)): L[i] = L[i] + L[i-] print(L) #结果 ...