Advertisement
YEZAELP

SMMR-097: Crack

May 25th, 2021
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 2e9;
  5. const int N = 35;
  6. char str[N+10];
  7. int dp[N+10][N+10];
  8. int mx, l;
  9.  
  10. set <string> ans;
  11. bool p[N+10];
  12. int complete;
  13. void prt(int i, int j, int cnt){
  14.     if(complete >= 200) return;
  15.     if(cnt <= 0){
  16.         string s;
  17.         for(int idx=0;idx<l;idx++){
  18.             if(p[idx]) s += str[idx];
  19.         }
  20.         if(ans.find(s) == ans.end()){
  21.             ans.insert(s);
  22.             complete ++;
  23.         }
  24.         return;
  25.     }
  26.     if(i > j) return;
  27.     if(str[i-1] == str[j-1] and dp[i][j] == cnt){
  28.         p[i-1] = p[j-1] = true;
  29.         prt(i+1, j-1, cnt-2);
  30.         p[i-1] = p[j-1] = false;
  31.     }
  32.     else{
  33.         if(dp[i+1][j] == cnt)
  34.             prt(i+1, j, cnt);
  35.         if(dp[i][j-1] == cnt)
  36.             prt(i, j-1, cnt);
  37.     }
  38. }
  39.  
  40. int f(int i, int j){
  41.     if(i == j){
  42.         return dp[i][j] = 1;
  43.     }
  44.     else if(i+1 == j and str[i-1] == str[j-1]){
  45.         return dp[i][j] = 2;
  46.     }
  47.     if(dp[i][j] != 0) return dp[i][j];
  48.     if(str[i-1] == str[j-1]){
  49.         return dp[i][j] = f(i+1, j-1) + 2;
  50.     }
  51.     return dp[i][j] = max(f(i+1, j), f(i, j-1));
  52. }
  53.  
  54. int main(){
  55.  
  56.     scanf("%s", str);
  57.     l = strlen(str);
  58.  
  59.     for(int i=l;i>=1;i--){
  60.         for(int j=i;j<=l;j++){
  61.             if(i == j) dp[i][j] = 1;
  62.             else if(i+1 == j and str[i-1] == str[j-1]) dp[i][j] = 2;
  63.             else if(str[i-1] == str[j-1]) dp[i][j] = dp[i+1][j-1] + 2;
  64.             else dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
  65.         }
  66.     }
  67.  
  68.     int mx = dp[1][l];
  69.  
  70.     prt(1, l, mx);
  71.  
  72.     for(auto i: ans) {
  73.         cout << i << "\n";
  74.     }
  75.  
  76.     return 0;
  77. }
  78. /**
  79.  
  80. CMUOCOM
  81. = MOCOM
  82.  
  83. CMUOCCOCOMC
  84. = CMOCCCOMC
  85. = CMOCOCOMC
  86.  
  87. CMUO
  88. = C
  89. = M
  90. = U
  91. = O
  92.  
  93. COMUUMCO
  94. */
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement