Cod sursa(job #632420)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 11 noiembrie 2011 01:41:50
Problema Tm Scor 100
Compilator cpp Status done
Runda arhiva-teme-fmi Marime 3.59 kb
#include<fstream>
#include<list>
#include<iterator>
#include<cstring>
using namespace std;

ifstream fin("tm.in");
ofstream fout("tm.out");

void solve(char s[])
{
        list<char> l;

        for(int i=0;i<strlen(s);i++)
            l.push_back(s[i]);
            
       	list<char>::iterator it;

        //verificam daca apartine limbajului a*b*c*
        for(it=l.begin();it!=l.end() && (char)*it=='a';it++);
        for(;it!=l.end() && (char)*it=='b';it++);
        for(;it!=l.end() && (char)*it=='c';it++);        
        //daca nu ajungem la blanc dupa ce am trecut prin starile de mai sus
        //=>nu apartine limbajului
        if(it!=l.end())
        {
            fout<<"NU\n";    
            return;
        }
        
        //verificam a cu b
        it=l.begin();
        int existaB=1;
        int cnt=0;

        for(it=l.begin();it!=l.end() && (char)*it=='a' && existaB;)
        {
            *it='x';
            cnt++;

            for(it=l.begin();it!=l.end() && (char)*it!='b';it++);
            if(it!=l.end())
            {
                //deci exista b => marcam
                *it='y';
                existaB=1;
            }
            else
            //schimbam starea
                existaB=0;
            //mutam capul inapoi pe a
           for(it=l.begin();it!=l.end() && (char)*it!='a';it++); 
        }
        
        //verificam din ce cauza/in ce am schimbat starea
        if(it==l.end())
        {
            if(existaB==1)
            {
                //daca am iesit ca am terminat a-urile
                //verificam daca mai sunt b-uri
                for(it=l.begin();it!=l.end() && (char)*it!='b';it++);
                if(it==l.end())
                {
                    fout<<"DA\n";
                    return;
                }           
            }
        }
    
            //verificam b cu c
            int existaC=1;
            //demarcam b-urile
            for(it=l.begin();it!=l.end();it++)
                if((char)*it=='y')
                    *it='b';
            //mutam capul pe b
            for(it=l.begin();it!=l.end() && (char)*it!='b';it++);
            for(;it!=l.end() && (char)*it=='b' && existaC;)
            {
                *it='y';
    
                for(it=l.begin();it!=l.end() && (char)*it!='c';it++);
                if(it!=l.end())
                {
                    //deci exista c => marcam
                    *it='z';
                    existaC=1;
                }
                else
                //schimbam starea
                    existaC=0;
                //mutam capul inapoi pe b
               for(it=l.begin();it!=l.end() && (char)*it!='b';it++); 
            }

            //verificam din ce cauza/in ce am schimbat starea
            if(it==l.end())
            {
                if(existaC==1)
                {
                    //daca am iesit ca am terminat b-urile si am avut si c
                    //verificam daca mai sunt c-uri
                    for(it=l.begin();it!=l.end() && (char)*it!='c';it++);
                    if(it==l.end())
                    {
                        fout<<"DA\n";
                        return;
                    }
                    else
                        fout<<"NU\n";
                }
                else
                    fout<<"NU\n";
            }
            else
                fout<<"NU\n";
}

int main()
{
    int T;
    fin>>T;
    while(T--)
    {
        char s[10000];
        fin>>s;
        solve(s);
    }    
    return 0;
}