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:暴力,开始我以为暴力得到回文串,然后差分得到前缀和,但是前缀和涉及到了交叉问题可能会导致出错。所以,目前还不行。(不过别人说可以,那再想想)

最新文章

  1. 高性能的JavaScript--数据访问(1)
  2. ex3-数字和数字计算
  3. 网页加载图片原理&lt;转&gt;
  4. Android屏幕禁止休眠的方法
  5. 禁用iPhone手机浏览器上给电话号码自动加上的link样式
  6. django的安装和搭建
  7. struts2拦截器-简单实现非法登录验证
  8. VS2010安装MSDN
  9. JSON 日期格式带 T 问题
  10. Android - 通过Intent启动Activity
  11. java数组基础
  12. Yii2总结
  13. 2018铁三测评题write以及一些想送给你们的话
  14. 吴恩达 Deep learning 第二周 神经网络基础
  15. SVM-支持向量机原理详解与实践
  16. 从零开始写C# MVC框架之--- 配置log4日志
  17. uva11729 - Commando War(贪心)
  18. angularJS ui router 多视图单独刷新问题
  19. 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告
  20. JDBC性能优化篇

热门文章

  1. hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径
  2. Codeforces Round #310 (Div. 2)简洁题解
  3. spark学习(五)总结及其demo
  4. websocket笔记
  5. spring mvc拦截器原理分析
  6. 切换横屏幕 onCreate 多次执行问题
  7. Webstorm上面通过babel将es6转化为es5
  8. CodeForces 321A Ciel and Robot(数学模拟)
  9. 当 外部 input 值的改变,获取 当前 input type=&quot;hidden&quot; 的值
  10. ActiveMQ(一) 转