1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define mod 10007 6 7 char str[1005]; 8 int dp[1005][1005]; 9 10 int main() 11 { 12 int t,cs=1; 13 scanf("%d",&t); 14 while(t--){ 15 scanf("%s",str); 16 int len=strlen(str); 17 memset(dp,0,sizeof(dp)); 18 for(int i=0;i<len;i++) 19 dp[i][i]=1; 20 for(int i=1;i<len;i++) 21 for(int j=i-1;j>=0;j--) 22 { 23 dp[j][i]=(dp[j][i-1]+dp[j+1][i]-dp[j+1][i-1]+mod)%mod;// 前面部分+后面部分-重叠部分,+mod的原因是每次计算都是先计算该值的右面取余,再计算该值的下面部分取余,再减去重叠部分的值,有可能右面部分%mod+下面部分%mod-重叠部分的值会是一个负数,所以要先加mod,然后再取余 24 if(str[i]==str[j]) 25 dp[j][i]=(dp[j][i]+dp[j+1][i-1]+1+mod)%mod; 26 } 27 printf("Case %d: %d ",cs++,dp[0][len-1]); 28 } 29 return 0; 30 }