Cod sursa(job #346577)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 8 septembrie 2009 17:26:16
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <string>
using namespace std;
#define Nmax 11
#define Lmax 10001

int a[Lmax];
int t,n,i;
string s;

int work(){
	int i,zs;
	string :: iterator it =s.begin();
   for(i=0,zs=0; i<n && zs<s.size() ;){
   	if(a[i]==s[zs]-'0') i++, zs++;
      else{
         if(s[zs]=='1' || s[zs]=='2' || s[zs]=='3') return 0;
         if(a[i]==1){
           if(s[zs] == 'A') i++,zs++; else
           if(s[zs] == 'B'){
                    s.erase(zs,1);
                    s.insert(zs,"1A3AC");
                    zs++, i++;
                    }else
           if(s[zs] == 'C'){
                    s.erase(zs,1);
                    s.insert(zs,"12A");
                    zs++, i++;
                    }
           } else
         if(a[i]==2){
           if(s[zs] == 'A' || s[zs] == 'C') i++,zs++;
           else s.insert(zs,"2"), i++, zs++; // era B si bag 2B
           }else
         if(a[i]==3){
           if(s[zs] == 'A') zs++,i++; else
           if(s[zs] == 'B') return 0; else
           if(s[zs] == 'C'){
                    s.erase(zs,1);
                    s.insert(zs,"3BC");
                    zs++, i++;
                    }
           }
         }
      }
      if(i==n && zs == s.size()) return 1;
      return 0;
}

int solve(){
   if(n==1) return 1;
   if(a[0] == 1){
   	if(n == 3 && a[1]==2) return 1;
      else s="1A3AC";
   } else
   if(a[0] == 2) s="2B";
   else s="3BC";

   return work();
}

int main(){
	freopen("perle.in","r",stdin);
   freopen("perle.out","w",stdout);
   scanf("%d",&t);
   for(; t; t--){
   	scanf("%d",&n);
      for(i=0;i<n;++i) scanf("%d",&a[i]);

      printf("%d\n",solve());
   }

   fclose(stdin); fclose(stdout);
   return 0;
}