/*
求回文串组成的对数的总数
分析:现对数据进行预处理,求出第 i 个字符前面出现过多少个回文串
然后 dp 的方法 :dp[i] = dp[i-1] + Sum{ g[j][i]==1?sum[j-1]:0 }
g[j][i] == 1 , 则 string[j,i] 是回文串
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define manx 2009
char s[manx];
long long dp[manx],g[manx][manx],sum[manx];
int main(){
while(cin>>s+1){
int len = strlen(s+1);
memset(g,0,sizeof(g));
dp[0] = sum[0] = 0;
for(int i=1;i<=len;i++){
dp[i] = 0, sum[i] = 1;
}
for(int i=2;i<=len;i++){
if(s[i]==s[i-1]) {
sum[i] ++;
g[i-1][i]=1;
}
}
for(int i=1;i<=len;i++){
g[i][i] = 1; //是回文串符串
for(int j=i-2;j>=1;j--){
if(s[j]==s[i] && g[j+1][i-1]) {
g[j][i] = 1;
sum[i] ++;
}
}
if(i>=2) sum[i] += sum[i-1];
}
for(int i=1;i<=len;i++){
for(int j=i;j>=1;j--){
if(g[j][i])
dp[i] += sum[j-1];
}
if(i>=2) dp[i] += dp[i-1];
}
cout<<dp[len]<<endl;
}
}
159D回文串预处理
最新推荐文章于 2021-03-09 21:50:04 发布