Advertisement
Mirbek

Субпалиндромы (с for)

Feb 22nd, 2022
784
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 5005;
  6. const int mod = 29876543;
  7.  
  8. int n;
  9. int dp[N][N];
  10. string s;
  11.  
  12. //int get(int l, int r) {
  13. //    if (l > r) return 0;
  14. //    if (l == r) return 1;
  15. //    if (dp[l][r] > 0) return dp[l][r];
  16. //    int ans = 0;
  17. //    int a1 = get(l, r - 1);
  18. //    int a2 = get(l + 1, r);
  19. //    int a3 = get(l + 1, r - 1);
  20. //    ans = (ans + a1) % mod;
  21. //    ans = (ans + a2) % mod;
  22. //    ans = (ans - a3) % mod;
  23. //    if (ans < 0) ans += mod;
  24. //    if (s[l] == s[r]) {
  25. //        ans += get(l + 1, r - 1) + 1;
  26. //        ans %= mod;
  27. //    }
  28. //    dp[l][r] = ans;
  29. //    return ans;
  30. //}
  31.  
  32. int main(){
  33.     cin >> s;
  34.     n = s.size();
  35.     s = ' ' + s;
  36.  
  37.     for (int r = 1; r <= n; r++) {
  38.         for (int l = r; l >= 1; l--) {
  39.             if (l == r) {
  40.                 dp[l][r] = 1;
  41.                 continue;
  42.             }
  43.             dp[l][r] = (dp[l][r] + dp[l][r - 1]) % mod;
  44.             dp[l][r] = (dp[l][r] + dp[l + 1][r]) % mod;
  45.             dp[l][r] = (dp[l][r] - dp[l + 1][r - 1]) % mod;
  46.             if (dp[l][r] < 0)
  47.                 dp[l][r] += mod;
  48.             if (s[l] == s[r]) {
  49.                 dp[l][r] = (dp[l][r] + dp[l + 1][r - 1] + 1) % mod;
  50.             }
  51.         }
  52.     }
  53.  
  54.     cout << dp[1][n] << endl;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement