Pagini recente » Cod sursa (job #1286379) | Cod sursa (job #1270231) | Cod sursa (job #2275027) | Cod sursa (job #3136691) | Cod sursa (job #973813)
Cod sursa(job #973813)
#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()
{
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 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].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;
}*/
for (int i=1, j=len; palindromes[i][j].Size > 0; ++i, --j)
{
//cout << (char)(palindromes[i][j].Letter + '0') << " ";
palindrom[i-1] = palindromes[i][j].Letter + '0';
}
//cout << endl;
for (int i=0; i<palindromes[1][len].Size / 2; ++i)
{
palindrom[palindromes[1][len].Size - i - 1] = palindrom[i];
}
palindrom[palindromes[1][len].Size] = 0;
fout << palindrom << "\n";
return 0;
}