Cod sursa(job #434890)

Utilizator darrenRares Buhai darren Data 6 aprilie 2010 18:09:33
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#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();
}