fork download
  1.  
  2. #include <bits/stdc++.h>
  3. #define N 1005
  4.  
  5. #define MOD 10007
  6.  
  7. using namespace std;
  8.  
  9. int memo[N][N][2];
  10. char s[N];
  11.  
  12. int DP(int ini, int fin, int flag){
  13.  
  14. if(ini > fin)return 1;
  15. if(ini == fin){
  16.  
  17. if(flag == 0)return 1;
  18. return 2;
  19. }
  20.  
  21. int &ret = memo[ini][fin][flag];
  22.  
  23. if(ret != -1)return ret;
  24. long long ans = 0;
  25.  
  26. if(s[ini] == s[fin]){
  27.  
  28. ans += DP(ini + 1, fin - 1, 1);
  29. ans += DP(ini + 1, fin, flag);
  30. ans += DP(ini, fin - 1, flag);
  31. if(ini + 1 < fin)ans -= DP(ini + 1, fin - 1, flag);
  32.  
  33. }
  34. else{
  35.  
  36. ans += DP(ini + 1, fin, flag);
  37. ans += DP(ini, fin - 1, flag);
  38. if(ini + 1 < fin)ans -= DP(ini + 1, fin - 1, flag);
  39.  
  40. }
  41.  
  42. if(ans >= MOD)ans %= MOD;
  43. if(ans < 0)ans += MOD;
  44.  
  45. return ret = ans;
  46. }
  47.  
  48. int main() {
  49.  
  50. int tc = 0;
  51. scanf("%d", &tc);
  52.  
  53. while(tc--){
  54.  
  55. scanf("%s", &s);
  56. int n = strlen(s);
  57.  
  58. memset(memo, -1, sizeof memo);
  59.  
  60.  
  61. int ans = DP(0, n - 1, 0);
  62. printf("%d\n", ans);
  63.  
  64. }
  65.  
  66. }
  67.  
  68.  
  69.  
Success #stdin #stdout 0s 11040KB
stdin
1
aaaaa


stdout
35