CodeForces-245H:Queries for Number of Palindromes(3-14:区间DP||回文串)
2024-09-30 07:10:27
Times:5000ms;
Memory limit:262144 kB
给定字符串S(|S|<=5000),下标由1开始。然后Q个问题(Q<=1e6),对于每个问题,给定L,R,回答区间[L,R]里有多少个回文串。
请想出两种或者以上的方法。
------------------------分界线--------------------------
方法1:区间DP。
容斥一下,dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+ok[i][j],(ok表示是否是个回文串)。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int dp[maxn][maxn],ok[maxn][maxn],N,Q;
char c[maxn];
void DP()
{
for(int i=N;i>=;i--)
for(int j=i;j<=N;j++){
if(j-i==) ok[i][j]=,dp[i][j]=;
else if(j-i==) dp[i][j]=ok[i][j]=dp[i][i]+dp[j][j]+(c[i]==c[j]?:);
else {
ok[i][j]=ok[i+][j-]&(c[i]==c[j]);
dp[i][j]=dp[i+][j]+dp[i][j-]-dp[i+][j-]+ok[i][j];
}
}
}
int main()
{
scanf("%s",c+);
N=strlen(c+);
DP();
scanf("%d",&Q);
while(Q--){
int x,y; scanf("%d%d",&x,&y);
printf("%d\n",dp[x][y]);
}
return ;
}
方法2:
马拉车:每个为起点,然后预处理得到每个为起点的回文串个数前缀和。 为了训练,就先不给带代码了。
方法3:回文树,这个我还不会。
方法4:暴力,开始我以为暴力得到回文串,然后差分得到前缀和,但是前缀和涉及到了交叉问题可能会导致出错。所以,目前还不行。(不过别人说可以,那再想想)
最新文章
- 高性能的JavaScript--数据访问(1)
- ex3-数字和数字计算
- 网页加载图片原理<;转>;
- Android屏幕禁止休眠的方法
- 禁用iPhone手机浏览器上给电话号码自动加上的link样式
- django的安装和搭建
- struts2拦截器-简单实现非法登录验证
- VS2010安装MSDN
- JSON 日期格式带 T 问题
- Android - 通过Intent启动Activity
- java数组基础
- Yii2总结
- 2018铁三测评题write以及一些想送给你们的话
- 吴恩达 Deep learning 第二周 神经网络基础
- SVM-支持向量机原理详解与实践
- 从零开始写C# MVC框架之--- 配置log4日志
- uva11729 - Commando War(贪心)
- angularJS ui router 多视图单独刷新问题
- 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告
- JDBC性能优化篇
热门文章
- hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径
- Codeforces Round #310 (Div. 2)简洁题解
- spark学习(五)总结及其demo
- websocket笔记
- spring mvc拦截器原理分析
- 切换横屏幕 onCreate 多次执行问题
- Webstorm上面通过babel将es6转化为es5
- CodeForces 321A Ciel and Robot(数学模拟)
- 当 外部 input 值的改变,获取 当前 input type=";hidden"; 的值
- ActiveMQ(一) 转