func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MOD = 1e9 + 7;   const int MAXN = 2000 + 5;   int dp[MAXN][MAXN] = {0};   int previous[MAXN] = {0};   void calculatePrevious(const string &s, const string &p) {     int sSize = s.length();     int pSize = p.length();     for (int i = 0; i < sSize; ++i) {       previous[i] = -2;       int currentP = pSize - 1;       int currentS = i;       while (currentP >= 0 && currentS >= 0) {         while (currentS >= 0 && s[currentS] != p[currentP]) {           currentS--;         }         if (currentS >= 0) {           currentP--;           currentS--;         }       }       if (currentP == -1) {         previous[i] = currentS;       }     }   }   int main() {     string s, p;     cin >> s >> p;     int sSize = s.length();     int pSize = p.length();     calculatePrevious(s, p);     for (int i = 1; i <= sSize; ++i) {       for (int j = 0; j < sSize; ++j) {         dp[i][j] = dp[i - 1][j];         if (j > 0) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1]);         int prev = previous[i - 1];         if (prev != -2) {           int toDelete = (i - 1) - prev - pSize;           int newDelete = j - toDelete;           int newIndex = prev + 1;           if (newDelete >= 0 && newIndex >= newDelete) {             dp[i][j] = max(dp[i][j], 1 + dp[newIndex][newDelete]);           }         }       }     }     for (int i = 0; i < sSize; ++i) cout << dp[sSize][i] <<    ;     cout << 0 << endl;     return 0;   }   