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; }


浙公网安备 33010602011771号