您的位置:首页 > 其它

hihoCoser(#1149 : 回文字符序列)

2016-02-25 20:33 239 查看
时间限制:2000ms
单点时限:1000ms
内存限制:256MB

描述

给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个。内容相同位置不同的子序列算不同的子序列。

输入

第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。

输出

对于每组数据输出一行,格式为"Case #X: Y",X代表数据编号(从1开始),Y为答案。答案对100007取模。

数据范围

1 ≤ T ≤ 30

小数据

字符串长度 ≤ 25

大数据

字符串长度 ≤ 1000

样例输入
5
aba
abcbaddabcba
12111112351121
ccccccc
fdadfa

样例输出
Case #1: 5
Case #2: 277
Case #3: 1333
Case #4: 127
Case #5: 17


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MOD=100007;
char buf[1005];
int dp[1005][1005];
int main()
{
int T;
scanf("%d",&T);
int cas=1;
while(T--)
{
memset(dp,0,sizeof(dp));
scanf("%s",buf);
int len=strlen(buf);
for(int j=0;j<len;j++)
{
dp[j][j]=1;
for(int i=j-1;i>=0;i--)
{
dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+MOD)%MOD;
if(buf[i]==buf[j])
dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1)%MOD;
}
}
printf("Case #%d: %d\n",cas++,dp[0][len-1]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: