Ranking (as of 2015-07-06): 50 out of 390
Language: C++
/*
UVa 11103 - WFF 'N PROOF
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11103_WFF_N_PROOF.cpp
*/
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int nr_chars_max = 100;
char symbols[nr_chars_max + 1];
int indices[nr_chars_max];
bool compare_symbol(int i, int j)
{
char ci = symbols[i], cj = symbols[j];
if (isupper(ci) && isupper(cj)) {
if (ci == 'N' && cj == 'N')
return i < j;
else if (ci == 'N')
return true;
else if (cj == 'N')
return false;
else
return i < j;
}
else if (islower(ci) && islower(cj))
return i < j;
else
return ci < cj;
}
int main()
{
while (true) {
scanf("%s", symbols);
if (!strcmp(symbols, "0"))
break;
int nr_symbols = strlen(symbols), nr_Ns = 0, nr_KACEs = 0, nr_variables = 0;
for (int i = 0; i < nr_symbols; i++) {
indices[i] = i;
switch (symbols[i]) {
case 'N':
nr_Ns++; break;
case 'K': case 'A': case 'C': case 'E':
nr_KACEs++; break;
case 'p': case 'q': case 'r': case 's': case 't':
nr_variables++; break;
}
}
sort(indices, indices + nr_symbols, compare_symbol);
#ifdef DEBUG
for (int i = 0; i < nr_symbols; i++)
putchar(symbols[indices[i]]);
putchar('\n');
#endif
int nr_wff_KACEs = nr_KACEs, nr_wff_variables = nr_variables;
if (nr_wff_variables) {
if (nr_wff_KACEs > nr_wff_variables - 1)
nr_wff_KACEs = nr_wff_variables - 1;
else
nr_wff_variables = nr_wff_KACEs + 1;
for (int i = 0; i < nr_Ns; i++)
putchar('N');
for (int i = nr_Ns, j = nr_wff_KACEs; j; i++, j--)
putchar(symbols[indices[i]]);
for (int i = nr_Ns + nr_KACEs, j = nr_wff_variables; j; i++, j--)
putchar(symbols[indices[i]]);
putchar('\n');
}
else
puts("no WFF possible");
}
return 0;
}
No comments:
Post a Comment