Run Time: 0.010
Ranking (as of 2016-11-16): 10 out of 371
Language: C++
/*
UVa 1261 - String Popping
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_1261_String_Popping.cpp
*/
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
const int nr_chars_max = 25;
set< pair<int, int> > visited;
bool string_popping(int n, int bs)
{
#ifdef DEBUG
printf("%d: ", n);
if (n) {
for (int b = 1 << (n - 1); b; b >>=1)
putchar((bs & b) ? 'b' : 'a');
}
putchar('\n');
#endif
if (!n)
return true;
if (n == 1)
return false;
int m = n, b = 1 << (n - 1), pb = bs & b, ctr = 1;
for (m--, b >>= 1; b; m--, b >>= 1) {
int cb = bs & b;
if (cb && pb || !cb && !pb) // consecutive same characters
ctr++;
else {
if (ctr > 1) {
int mask = (1 << m) - 1;
int nbs = bs & mask | (bs >> ctr) & ~mask; // pop consecutive same characters
pair<set< pair<int, int> >::iterator, bool> result =
visited.insert(make_pair(n - ctr, nbs));
if (result.second) {
if (string_popping(n - ctr, nbs))
return true;
}
}
pb = cb, ctr = 1;
}
}
if (ctr > 1) {
int nbs = bs >> ctr;
pair<set< pair<int, int> >::iterator, bool> result =
visited.insert(make_pair(n - ctr, nbs));
if (result.second) {
if (string_popping(n - ctr, nbs))
return true;
}
}
return false;
}
int main()
{
int T;
scanf("%d", &T);
while (T--) {
char s[nr_chars_max + 1];
scanf("%s", s);
int n = strlen(s);
int bs = 0;
for (int i = n - 1, b = 1; i >= 0; i--, b <<= 1)
if (s[i] == 'b')
bs |= b;
visited.clear();
visited.insert(make_pair(n, bs));
bool result = string_popping(n, bs);
#ifdef DEBUG
printf("visited: %u\n", visited.size());
#endif
puts((result) ? "1" : "0");
}
return 0;
}
No comments:
Post a Comment