Pagini recente » Cod sursa (job #700438) | Cod sursa (job #501266) | Cod sursa (job #1846209) | Cod sursa (job #1408865) | Cod sursa (job #2549954)
#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;
}