codeforces 159D dp + strings 好题

关键:很巧妙的枚举思路,枚举回文字符串中间字符的位置i,复杂度O(n),

然后统计  以i为起始位置的回文串的个数放在数组p[]中,以末尾位置的回文串的个数放在数组q[]中。

最后处理一下即可

View Code
#include<stdio.h>
#include<string.h>
#define lld __int64
char s[2006];
int p[2006], q[2006];
lld ans;
int main()
{
    int i, j;
    int l = strlen(gets(s+1));
    int a, b;
    for(i = 1; i <= l; i++)    
    {
        for(a = i, b = i+1; a && b <= l && s[a] == s[b]; a--, b++) 
            p[a]++, q[b]++;
        for(a = b = i; a && b <= l && s[a] == s[b]; a--, b++) 
            p[a]++, q[b]++;
    }
    for(i = l; i >= 1; i--)
            p[i] += p[i+1];
        for(i = 1; i <= l; i++)
            ans +=(lld) p[i+1] * q[i];
        printf("%I64d\n", ans);
    return 0;
}
posted @ 2012-11-08 13:58  To be an ACMan  Views(215)  Comments(0)    收藏  举报