Cod sursa(job #189008)

Utilizator Mishu91Andrei Misarca Mishu91 Data 11 mai 2008 14:23:11
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
/*
ID:andrei.9
LANG:C++
TASK:calfflac
*/
#include <cstdio>
#include <string>
using namespace std;

#define MAX_SUB 2000
#define MAX_S 20000

string S,R,P,Sol;
int poz[MAX_S],nrsp;

void read(void);
void solve(void);
bool pal(int, int);
inline int min(int, int);

int main()
{
    freopen("calfflac.in","rt",stdin);
    freopen("calfflac.out","wt",stdout);
    read();
    solve();
}

bool pal(int i, int j)
{
    string s,r;
    s = P.substr(i,j - i + 1);
    r = R.substr(P.size() - j - 1, j - i + 1);
    if(s == r)
        return true;
    return false;
}

void read()
{
    char c;
    int N;
    while(scanf("%c",&c) != EOF)
    {
        S += c;
        if(isalpha(c))
        {
            P += tolower(c);
            poz[P.size() - 1] = S.size() - 1;
        }
        else
            ++nrsp;
    }
    for(int i=0; i<(N = P.size()); ++i)
        R += P[N - i - 1];
}

void solve()
{
    int nr, maxnr = 0;
    int  N = P.size(), L = min(N, (MAX_SUB - nrsp + 1));
    for(int i=0; i < N; ++i)
        for(int j = i + 3; j < 1311; ++j)
            if(pal(i,j))
                if(j - i > maxnr)
                {
                    maxnr = j - i + 1;
                    Sol = S.substr(poz[i],poz[j]-poz[i]+1);
                }
    printf("%d\n%s\n",maxnr,Sol.c_str());
}

inline int min(int a, int b)
{
    return (a < b)? a : b;
}