2018ACM-CCPC湖南湘潭邀请赛 String Transformation

String Transformation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 57    Accepted Submission(s): 17


Problem Description
Bobo has a string  S=s1s2sn consists of letter `a`, `b` and `c`.
He can transform the string by inserting or deleting substrings `aa`, `bb` and `abab`.

Formally,  A=uwv (`` '' denotes string concatenation) can be transformed into  A=uv and vice versa where  u v are (possibly empty) strings and  w{aa,bb,abab}.

Given the target string  T=t1t2tm, determine if Bobo can transform the string  S into  T.
 

Input
The input consists of several test cases and is terminated by end-of-file.

The first line of each test case contains a string  s1s2sn.
The second line contains a string  t1t2tm.
 

Output
For each test case, print `Yes` if Bobo can. Print `No` otherwise.

## Constraint

1n,m104
s1,s2,,sn,t1,t2,,tm{a,b,c}
* The sum of  n and  m does not exceed  250,000.
 

Sample Input
 
  
abbaaccaaab
 

Sample Output
 
  
YesNoNo
Hint
For the first sample, Bobo can transform as `ab => aababb => babb => ba`.
 
//deque:双端队列,遇到aa,bb就删除,以c作为分隔符,两个c不一样多就输出no
后面应当每个c前后只剩下ab||ba||b||a
空则push,不然进行判断,相等pop且不放,不同,判断之后的,否则放
#include <iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<deque>
#define ll long long
using namespace std;
char a[10005];
char b[10005];
deque<int>q1,q2;
int main()
{
    while(cin>>a>>b)
    {
        while(!q1.empty ()) q1.pop_back();
        while(!q2.empty ()) q2.pop_back();
        int la=strlen(a);
        int lb=strlen(b);
       /* if((la%2)!=(lb%2)) 
        {
            printf("No\n");
            continue;
        }*/
        int c1=0;
        int c2=0;
        for(int i=0;i<la;i++)
        {
            if(a[i]=='c')
            {
                q1.push_back(3);
                c1++;
            }
            else if(a[i]=='a')
            {
                if(q1.empty ()) 
                {
                    q1.push_back(1);
                    continue;
                }
                if(q1.back()==1)
                {
                    q1.pop_back();
                }
                else if(q1.back()==2)
                {
                    if(i<la-1&&a[i+1]=='b')
                    {
                        q1.pop_back();
                        i++;
                        if(q1.empty ()||q1.back ()!=1) 
                        {
                            q1.push_back (1);
                        }
                        else if(q1.back ()==1)
                        {
                            q1.pop_back();
                        }

                    }
                    else q1.push_back (1);
                }
                else q1.push_back (1);

            }
            else if(a[i]=='b')
            {
                if(q1.empty ()) 
                {
                    q1.push_back(2);
                    continue;
                }
                if(q1.back()==2)
                {
                    q1.pop_back();
                }
                else if(q1.back()==1)
                {
                    if(i<la-1&&a[i+1]=='a')
                    {
                        q1.pop_back();
                        i++;
                        if(q1.empty ()||q1.back ()!=2) 
                        {
                            q1.push_back (2);
                        }
                        else if(q1.back ()==2)
                        {
                            q1.pop_back();
                        }

                    }
                    else q1.push_back(2);
                }
                else q1.push_back(2);
            }
        }
        for(int i=0;i<lb;i++)
        {
            if(b[i]=='c')
            {
                q2.push_back(3);
                c2++;
            }
            else if(b[i]=='a')
            {
                if(q2.empty ()) 
                {
                    q2.push_back(1);
                    continue;
                }
                if(q2.back()==1)
                {
                    q2.pop_back();
                }
                else if(q2.back()==2)
                {
                    if(i<lb-1&&b[i+1]=='b')
                    {
                        q2.pop_back();
                        i++;
                        if(q2.empty ()||q2.back ()!=1) 
                        {
                            q2.push_back (1);
                        }
                        else if(q2.back ()==1)
                        {
                            q2.pop_back();
                        }

                    }
                    else q2.push_back (1);
                }
                else q2.push_back (1);

            }
            else if(b[i]=='b')
            {
                if(q2.empty ()) 
                {
                    q2.push_back(2);
                    continue;
                }
                if(q2.back()==2)
                {
                    q2.pop_back();
                }
                else if(q2.back()==1)
                {
                    if(i<lb-1&&b[i+1]=='a')
                    {
                        q2.pop_back();
                        i++;
                        if(q2.empty ()||q2.back ()!=2) 
                        {
                            q2.push_back (2);
                        }
                        else if(q2.back ()==2)
                        {
                            q2.pop_back();
                        }
                    }
                    else q2.push_back(2);
                    
                }
                else q2.push_back(2);
            }
        }
        bool f=1;
        if(c1!=c2||q1.size()!=q2.size()) f=0;
        else
        {
            while(!q1.empty ())
            {
                if(q1.front() ==1&&q2.front() ==2)
                {
                    q1.pop_front ();
                    q2.pop_front ();
                    if(q1.empty ())
                    {
                        f=0;
                        break;
                    }
                    else if(q1.front() ==2&&q2.front() ==1)
                    {
                        q1.pop_front ();
                        q2.pop_front ();
                    }
                    else 
                    {
                        f=0;
                        break;
                    }
                }
                else if(q1.front() ==2&&q2.front() ==1)
                {
                    q1.pop_front ();
                    q2.pop_front ();
                    if(q1.empty ())
                    {
                        f=0;
                        break;
                    }
                    else if(q1.front() ==1&&q2.front() ==2)
                    {
                        q1.pop_front ();
                        q2.pop_front ();
                    }
                    else 
                    {
                        f=0;
                        break;
                    }
                }
                else if(q1.front()==q2.front ())
                {
                    q1.pop_front();
                    q2.pop_front();
                }
                else 
                {
                    f=0;
                    break;
                }
            }
        }
        if(f) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
[ Copy to Clipboard ]    [ Save to File]


猜你喜欢

转载自blog.csdn.net/qq_41037114/article/details/80382233