Cod sursa(job #2549954)

Utilizator marius004scarlat marius marius004 Data 18 februarie 2020 09:47:00
Problema Subsir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <cstring>

std::ifstream f("subsir.in");
std::ofstream g("subsir.out");

const int NMAX = 505;
char s1[NMAX],s2[NMAX];
int dp[NMAX][NMAX];
std::string sol;

void reconst(int i,int j,int k){

    while(k){

        if(s1[i] == s2[j]){
            sol += s1[i];
            i--;
            j--;
            k--;
        }else if(dp[i - 1][j] == k)
            i--;
        else if(dp[i][j - 1] == k)
            j--;
    }
}

int main(){

    f >> (s1 + 1) >> (s2 + 1);

    int n = strlen(s1 + 1);
    int m = strlen(s2 + 1);

    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            if(s1[i] == s2[j])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = std::max(dp[i - 1][j],dp[i][j - 1]);

    reconst(n,m,dp[n][m]);

    int i = 1;
    int cnt = 0;
    int len = sol.size();

    while(i + len - 1 <= n){

        bool ok = true;
        int j;

        for(j = i;j <= i + len - 1 && ok;++j)
            if(s1[j] != sol[j - i])
                ok = false;

        if(ok){
            i = j + 1;
            cnt++;
        }else{
            i++;
        }
    }

    g << cnt;

    return 0;
}