
i don't think my code will gimme TLE...
any one help pls
thx in advance
[cpp]
#include <iostream>
#include <string.h>
#include <list>
using namespace std;
typedef struct {
char c[2];
} card_t;
typedef struct {
list<card_t> card;
} stack_t;
list<stack_t> li;
char str[1000],tmp[1000],*p;
bool input () {
card_t cd;
stack_t *st;
cin.getline(str,999);
if (strchr(str,'#'))
return false;
cin.getline(tmp,999);
strcat(str," ");
strcat(str,tmp);
li.clear();
for (int i=0;i<3;i++) {
st = new stack_t;
st->card.clear();
li.push_back(*st);
delete st;
}
p = strtok(str," \t\b\r\n");
while (p) {
cd.c[0] = p[0];
cd.c[1] = p[1];
st = new stack_t;
st->card.push_back(cd);
li.push_back(*st);
p = strtok(NULL," \t\b\r\n");
delete st;
}
return true;
}
inline void getPre3(list<stack_t>::iterator &cur) {
cur--;cur--;cur--;
}
inline void getPre(list<stack_t>::iterator &cur) {
cur--;
}
void solve () {
bool flag;
list<stack_t>::iterator cur,pre;
card_t tmp;
do {
flag = false;
cur = li.begin();
cur++;cur++;cur++;
for (;cur!=li.end();cur++) {
pre = cur;
getPre3(pre);
if (pre->card.size() &&
(cur->card.back().c[0]==pre->card.back().c[0] ||
cur->card.back().c[1]==pre->card.back().c[1])) {
flag = true;
tmp = cur->card.back();
cur->card.pop_back();
pre->card.push_back(tmp);
if (cur->card.size()==0) li.erase(cur);
break;
} else {
pre = cur;
getPre(pre);
if (pre->card.size() &&
(cur->card.back().c[0]==pre->card.back().c[0] ||
cur->card.back().c[1]==pre->card.back().c[1])) {
flag = true;
tmp = cur->card.back();
cur->card.pop_back();
pre->card.push_back(tmp);
if (cur->card.size()==0) li.erase(cur);
break;
}
}
}
} while (flag);
cout<<(li.size()-3)<<" pile";
if (li.size()>4) cout<<"s";
cout<<" remaining:";
cur = li.begin(); cur++;cur++;cur++;
for (;cur!=li.end();cur++)
cout<<" "<<cur->card.size();
cout<<endl;
}
int main () {
while (input()) {
solve ();
}
return 0;
}
[/cpp]