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 ...
随机推荐
- undefined reference to 'dlopen';undefined reference to 'dlclose';undefined reference to 'dlerror'等问题
在linux下,编译链接的时候,经常会遇到这样一个问题,undefined reference to.....,引起这个问题的原因在于在链接的时候缺少选项.下面举几个例子,并给出解决办法. 1. u ...
- phpmyadmin高级功能尚未完全设置部分功能未激活
1.登录phpmyadmin,点击导入,选择/var/ww/html/phpmyadmin/examples/create_tables.sql并执行 完成后可以看到多出了一个库phpmyadmin. ...
- 如何安装Ruby(Windows)
Ruby解释器的安装 1.Windows平台 想尽快安装并运行Ruby,可遵循如下步骤: 1.启动Web浏览器,访问 http://www.ruby-lang.org/en/downloads/ 2. ...
- socket传送二进制流的一些总结
第一次实质性的接触socket通信方面的工作,所以遇到的问题还真不少,写篇博客记录一下,提升下记忆. 需求是通过私有协议进行二进制数据的传输,必须保证数据包不能被丢失,所以选择tcp的socket进行 ...
- BZOJ3288: Mato矩阵(欧拉函数 高斯消元)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 386 Solved: 296[Submit][Status][Discuss] Descriptio ...
- ofbiz研究
近段时间,刚有有时间研究了下ofbiz ; 目前还是刚开始,后期会记录过程 有一起研究的没
- Java高并发之线程基本操作
结合上一篇同步异步,这篇理解线程操作. 1.新建线程.不止thread和runnable,Callable和Future了解一下 package com.thread; import java.tex ...
- java @override 全部报错
问.java @override 全部报错 答: 错误:在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显示让我们去掉 @override 注解 原因: @Ove ...
- 在ubuntu上安装subline
Sublime Text is a most popular, lightweight and smart cross-platform text and source code editor wit ...
- ubuntu安装tomcat7
1. 下载apache-tomcat-7.0.64.tar.gz 进入tomcat官网:http://tomcat.apache.org/download-70.cgi下载相应的压缩包: 2. 上传安 ...