codeforces 159D Palindrome pairs

分析:很容易想到的就是暴力解决,枚举以i为分隔点进行前后回文串总数的相乘。一开始想的可能会超时,结果AC了,不过网上还有一种比较省时的枚举回文串的方法,比较好!

虽然上面显示dp,string,但我感觉这完全就是string 的题目。

解法1、

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn = 2050;
int dpl[maxn],dpr[maxn];
char str[maxn];
bool judge(int i,int j){
    while(i<j){
        if(str[i]!=str[j]){
            return false;
        }
        i++;
        j--;
    }
    return true;
}

int main(){
    while(~scanf("%s",str)){
        memset(dpl,0,sizeof(dpl));
        memset(dpr,0,sizeof(dpr));
        int len=strlen(str);
        for(int i=0;i<len;i++){
            for(int j=0;j<=i;j++){
                if(judge(j,i)){
                    dpl[i]++;
                }
            }
            for(int j=len-1;j>=i;j--){
                if(judge(i,j)){
                    dpr[i]++;
                }
            }
        }
        for(int i=1;i<len;i++){
            dpl[i]+=dpl[i-1];
        }
        long long ans=0;
        for(int i=0;i<len-1;i++){
            ans+=dpl[i]*dpr[i+1];
        }
        printf("%I64d\n",ans);
    }
}
解法2、
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn = 2050;
int dpl[maxn],dpr[maxn];
char str[maxn];
int main(){
    while(~scanf("%s",str)){
        memset(dpl,0,sizeof(dpl));
        memset(dpr,0,sizeof(dpr));
        int len=strlen(str);
        for(int i=0;i<len;i++){
            int j1,j2;
            for(j1=i,j2=i;str[j1]==str[j2] && j1>=0 && j2<len;j1--,j2++){
                dpr[j1]++;
                dpl[j2]++;
            }
            for(j1=i,j2=i+1;str[j1]==str[j2] && j1>=0 && j2<len;j1--,j2++){
                dpr[j1]++;
                dpl[j2]++;
            }
        }
        for(int i=1;i<len;i++){
            dpl[i]+=dpl[i-1];
        }
        long long ans=0;
        for(int i=0;i<len-1;i++){
            ans+=dpl[i]*dpr[i+1];
        }
        printf("%I64d\n",ans);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值