时间限制: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 ",cas++,dp[0][len-1]); } return 0; }