分析:很容易想到的就是暴力解決,枚舉以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);
}
}