tag:dp
思路:枚举对称轴,用dpr[i]记录从0到位置i间回文串的个数,dpl[i]表示位置i到最后的回文串的个数。
需要求解的是形如回文串加回文串的种数,对于位置i,我们先累计前i个出现的回文串的个数乘上从i开始后面的回文串的个数,就是答案
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
#define maxn 2010
string s;
int dpl[maxn],dpr[maxn];
int main()
{
cin>>s;
memset(dpr,0,sizeof(dpr));
memset(dpl,0,sizeof(dpl));
int i,j,k;
for(i=0;i<s.size();i++)
{
for(j=i,k=i;j>=0&&k<s.size()&&s[k]==s[j];j--,k++)
dpl[j]++,dpr[k]++;
for(j=i,k=i+1;j>=0&&k<s.size()&&s[k]==s[j];j--,k++)
dpl[j]++,dpr[k]++;
}
for(i=1;i<s.size();i++)
dpr[i]+=dpr[i-1];
long long ans=0;
for(i=1;i<s.size();i++)
ans+=dpr[i-1]*dpl[i];
printf("%I64d\n",ans);
//system("pause");
return 0;
}