CROC-MBTU 2012, Elimination Round (ACM-ICPC) H Queries for Number of Palindromes(二维前缀和)

题目链接: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值