Cod sursa(job #37950)

Utilizator snaked31Stanica Andrei snaked31 Data 25 martie 2007 13:08:35
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.94 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

#define nm 2010

vector <int> v[nm];

char s[nm];
int n, i, j, l, k, en, mx;
int sol[nm], st[nm], lst[nm];;


inline int MAX(int a, int b)

{
	return (a < b ? b : a);
}


void read()

{
    scanf("%s", s);
    n = strlen(s);
}


void solve()

{
    /*for (i=0; i<n ++i)
    { */
    	for (j=n-1; j >= 0 ; j --)
        {
            for (k=i + 1; k<n; ++k)
            {
                if (s[j] == s[k])
                {
                    v[j].push_back(k);
                }
            }
        }
    //}

    mx = 0;

    for (i=0; i<n; ++i)
    {
    	l = 0;
        en = 0;
        for (j=i - 1; j>=0; --j)
        {
            for (k=0; k<v[j].size() && v[j][k] - i < l; ++k);
            if (k <v[j].size())
            {
            if (en > 0)
            {
                if (MAX(v[j][k] - i, i - j) < lst[en])
                {
                    lst[en] = MAX(v[j][k] - i, i - j);
                    st[en] = s[lst[en]] - '0';
                }
                else
                {
                	++en;
                    lst[en] = MAX(v[j][k] - i, i - j);
                    st[en] = s[lst[en]] - '0';
                }
            }
            else
            {
            	++en;
                lst[en] = MAX(v[j][k] - i, i - j);
                st[en] = s[lst[en]] - '0';
            }
            }
            
        }
        if (en > mx)
        {
        	mx = en;
            memcpy(sol, st, sizeof(st));
        }
    }


    for (i=0; i<n; ++i)
    {
    	l = 0;
        en = 0;
        for (j=i; j>=0; --j)
        {
            for (k=0; k<v[j].size() && v[j][k] - i < l; ++k);
            if (k < v[j].size())
            {
            if (en > 0)
            {
                if (MAX(v[j][k] - i, i - j) < lst[en])
                {
                    lst[en] = MAX(v[j][k] - i, i - j);
                    st[en] = s[lst[en]] - '0';
                }
                else
                {
                	++en;
                    lst[en] = MAX(v[j][k] - i, i - j);
                    st[en] = s[lst[en]] - '0';
                }
            }
            else
            {
            	++en;
                lst[en] = MAX(v[j][k] - i, i - j);
                st[en] = s[lst[en]] - '0';
            }
            }
            
        }
        if (en > mx)
        {
        	mx = en;
            memcpy(sol, st, sizeof(st));
        }
    }

    
}


void write()

{

	for (i=1; i<=mx; ++i)
    {
    	printf("%d", sol[i]);
    }
/*    for (i=mx; i>0; --i)
    	printf("%d", sol[i]);*/
    printf("\n");

}


int main()

{
	freopen("elimin2.in", "r", stdin);
    freopen("elimin2.out","w",stdout);

    read();
    solve();
    write();

    fclose(stdin);
    fclose(stdout);

	return 0;
}