Pagini recente » Cod sursa (job #2595536) | Cod sursa (job #281180) | Cod sursa (job #2212894) | Cod sursa (job #2454090) | Cod sursa (job #434890)
Cod sursa(job #434890)
#include<fstream>
#include<string>
#include<vector>
using namespace std;
const int SIZE = 505;
void read();
void doit();
void write();
string a, b;
int dim[SIZE][SIZE], cnt[SIZE][SIZE];
vector<string> set[2][SIZE];
int act, old = 1;
int main()
{
read();
doit();
write();
return 0;
}
void read()
{
ifstream fin( "subsir.in" );
fin >> a >> b;
fin.close();
}
void doit()
{
int i, j;
/*for ( i = 0; i <= 1; ++i )
for ( j = 1; j <= b.size(); ++j )
set[i][j].resize(505);*/
for ( i = 1; i <= a.size(); ++i )
{
act = !act;
old = !old;
for ( j = 1; j <= b.size(); ++j )
if ( a[i - 1] == b[j - 1] )
{
dim[i][j] = dim[i - 1][j - 1] + 1;
if ( set[old][j - 1].size() > set[act][j].size() )
set[act][j].resize( set[old][j - 1].size() );
copy( set[old][j - 1].begin(), set[old][j - 1].end(), set[act][j].begin() );
if ( set[act][j].size() == 0 )
{
string empty;
empty += a[i];
set[act][j].push_back( empty );
}
else
for ( int k = 0; k < set[act][j].size(); ++k )
set[act][j][k] += a[i - 1];
cnt[i][j] = set[act][j].size();
}
else if ( dim[i][j - 1] > dim[i - 1][j] )
{
dim[i][j] = dim[i][j - 1];
set[act][j] = set[act][j - 1];
cnt[i][j] = set[act][j].size();
}
else if ( dim[i - 1][j] > dim[i - 1][j] )
{
dim[i][j] = dim[i - 1][j];
set[act][j] = set[old][j];
cnt[i][j] = set[act][j].size();
}
else
{
dim[i][j] = dim[i - 1][j];
set[act][j] = set[act][j - 1];
cnt[i][j] = set[act][j].size();
for ( int k = 0; k < set[old][j].size(); ++k )
if ( find( set[act][j].begin(), set[act][j].end(), set[old][j][k] ) == set[act][j].end() )
{
set[act][j].push_back( set[old][j][k] );
++cnt[i][j];
}
}
set[old][j].clear();
set[old][j - 1].clear();
}
}
void write()
{
ofstream fout( "subsir.out" );
fout << cnt[a.size()][b.size()];
fout.close();
}