Cod sursa(job #973905)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 15 iulie 2013 21:55:41
Problema Elimin 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.79 kb
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

#define MAXN 2048

using namespace std;

string number;
char palindrom[MAXN];

struct Propperties
{
    unsigned short Size : 12;
    unsigned short Letter : 4;
};

Propperties palindromes[MAXN][MAXN];

int main()
{
    int lastPosOfLetter[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
    fstream fin("elimin2.in", fstream::in);
    fstream fout("elimin2.out", fstream::out);
    
    fin >> number;
    //cout << number << endl;
    
    int len = number.length();
    
    for (int i=1; i<=len; ++i)
    {
        palindromes[i][i].Size = 1;
        palindromes[i][i].Letter = number[i-1] - '0';
    }
    
    for (int i=len-1; i>=0; --i)
    {
        if (lastPosOfLetter[number[i] - '0'] == -1)
        {
            lastPosOfLetter[number[i] - '0'] = i + 1;
        }
    }
    
    for (int l=1; l<len; ++l)
    {
        for (int i=1; i<=len - l; ++i)
        {
            int left = i-1;
            int right = left + l;

            if (number[left] == number[right])
            {
                palindromes[i][i + l].Letter = number[left] - '0';
                palindromes[i][i + l].Size = palindromes[i + 1][i + l - 1].Size + 2;
            }
            else
            {
                if (palindromes[i][i + l - 1].Size == palindromes[i + 1][i + l].Size)
                {
                    //cout << left+1 << " " << right+1 << " -- yes\n"; 
                    if (palindromes[i][i + l - 1].Letter >= palindromes[i + 1][i + l].Letter)
                    {
                        palindromes[i][i + l].Letter = palindromes[i][i + l - 1].Letter;
                        palindromes[i][i + l].Size = palindromes[i][i + l - 1].Size;
                    }
                    else
                    {
                        palindromes[i][i + l].Letter = palindromes[i + 1][i + l].Letter;
                        palindromes[i][i + l].Size = palindromes[i + 1][i + l].Size;
                    }
                }
                else if (palindromes[i][i + l - 1].Size > palindromes[i + 1][i + l].Size)/* ||
                        (palindromes[i][i + l - 1].Letter != 0 && palindromes[i + 1][i + l].Letter == 0))*/
                {
                    palindromes[i][i + l].Letter = palindromes[i][i + l - 1].Letter;
                    palindromes[i][i + l].Size = palindromes[i][i + l - 1].Size;
                }
                else
                {
                    palindromes[i][i + l].Letter = palindromes[i + 1][i + l].Letter;
                    palindromes[i][i + l].Size = palindromes[i + 1][i + l].Size;
                }
            }
            
            //cout << left+1 << " " << right+1 << " -- " << palindromes[i][i + l].Size << " " << (char)(palindromes[i][i + l].Letter + '0') << endl;
        }
        //cout << endl;
    }
    
    /*for (int i=0; i<=len+1; ++i)
    {
        for (int j=0; j<=len+1; ++j)
        {
            cout << "(" << palindromes[i][j].Size << ", " << (char)(palindromes[i][j].Letter + '0') << ") ";
        }
        cout << endl;
    }*/
    
    int start = 0;
    int length = 0;
    int letter = 0;

    for (int i=0; i<len; ++i)
    {
        //cout << "Checking number: " << number[i] << endl;
        if (number[i] != '0')
        {
            if (palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Size > length)
            {
                start = i + 1;
                length = lastPosOfLetter[number[i] - '0'] - i;//palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Size;
                letter = palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Letter;
            }
            else if (palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Size == length && 
                     palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Letter > letter)
            {
                start = i + 1;
                length = lastPosOfLetter[number[i] - '0'] - i;//palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Size;
                letter = palindromes[i + 1][lastPosOfLetter[number[i] - '0']].Letter;
            }
        }
    }
    
    int end = start + length - 1;
    //cout << start << " " << length << " " << (char)(letter + '0') << endl;
    
    for (int i=start, j=end, index=0; palindromes[i][j].Size > 0; ++i, --j)
    {
        //cout << (char)(palindromes[i][j].Letter + '0') << " ";
        palindrom[index++] = palindromes[i][j].Letter + '0';
    }
    //cout << endl;
    
    for (int i=0; i<palindromes[start][end].Size / 2; ++i)
    {
        palindrom[palindromes[start][end].Size - i - 1] = palindrom[i];
    }
    palindrom[palindromes[start][end].Size] = 0;
    
    fout << palindrom << "\n";

    return 0;
}