fork download
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define el cout << '\n'
  5.  
  6. using namespace std;
  7.  
  8. const int maxn = 5e2;
  9. const int MOD = 1e9 +7;
  10.  
  11. int n;
  12. string s;
  13. ll dp[maxn + 10][maxn + 10], C[maxn + 10][maxn + 10];
  14.  
  15. int main()
  16. {
  17. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  18. if (fopen("EMPTY_STRING.INP", "r"))
  19. {
  20. freopen("EMPTY_STRING.INP", "r", stdin);
  21. freopen("EMPTY_STRING.OUT", "w", stdout);
  22. }
  23.  
  24. cin >> s;
  25. n = s.size();
  26. s = ' ' + s;
  27. for (int i = 0; i <= n + 1; i++)
  28. {
  29. C[0][i] = 1;
  30. dp[i][i - 1] = 1;
  31. }
  32. for (int j = 1; j <= n; j++)
  33. for (int i = 1; i <= n; i++)
  34. C[i][j] = (C[i][j - 1] + C[i - 1][j - 1]) % MOD;
  35. for (int i = n; i >= 1; i--)
  36. for (int j = i; j <= n; j++)
  37. {
  38. int len = j - i + 1;
  39. if (len & 1) continue;
  40. for (int k = i; k <= j; k++)
  41. {
  42. int lenik = k - i + 1;
  43. if (lenik & 1) continue;
  44. if (s[i] == s[k])
  45. {
  46. dp[i][j] += C[lenik/2][len/2] * dp[i + 1][k - 1] % MOD * dp[k + 1][j];
  47. dp[i][j] %= MOD;
  48. }
  49. }
  50. }
  51. cout << dp[1][n];
  52. }
  53.  
Success #stdin #stdout 0.01s 5296KB
stdin
Standard input is empty
stdout
1