题目链接:http://codeforces.com/contest/245/problem/H
题目大意:询问l r区间内有多少回文串
题目思路:直接暴力求出所有回文串,dp[i][j]表示s[i~j]是否为一个回文串,然后进行求二维前缀和,接着查询相应矩阵内的和即为答案。
以下是代码:
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define rep(i,a,b) for(ll i=a;i<=b;i++)
#define per(i,a,b) for(ll i=a;i>=b;i--)
#define ll long long
const int MAXN = 5e3+5;
char s[MAXN];
int dp[MAXN][MAXN],q,l,r;
int main()
{
while(~scanf("%s",s+1)){
memset(dp,0,sizeof(dp));
int len=strlen(s+1);
rep(i,1,len){
l=i,r=i;
while(l&&r<=len&&s[l]==s[r]){
dp[l][r]++;
l--;
r++;
}
l=i,r=i+1;
while(l&&r<=len&&s[l]==s[r]){
dp[l][r]++;
l--;
r++;
}
}
rep(i,1,len){
rep(j,1,len){
dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
}
}
scanf("%d",&q);
while(q--){
scanf("%d%d",&l,&r);
printf("%d\n",dp[r][r]-dp[l-1][r]-dp[r][l-1]+dp[l-1][l-1]);
}
}
return 0;
}