题解:CF2094D Tung Tung Sahur

· · 题解

如果他们的第一个音符不同,肯定不对。

然后统计出,这些串有几段,把每段音符个数计入下来。

如果段数不同不合法。

然后枚举每一段如果实际比弹得少不合法,如果如果实际比弹的两倍多也不合法。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int t,cnt,cntx,cnty,X[N],Y[N];
string s,p;
int main()
{
    cin>>t;
    while(t--)
    {
        cntx=cnty=0;
        cin>>s>>p;
        if(s[0]!=p[0])
        {
            cout<<"NO\n";
            continue;
        }
        for(int i=0;i<=p.size();++i) X[i]=Y[i]=0;
        cnt=1;
        for(int i=1;i<s.size();++i)
        {
            if(s[i]!=s[i-1])
            {
                X[++cntx]=cnt;
                cnt=1;
            }
            else cnt++;
        }
        X[++cntx]=cnt;
        cnt=1;
        for(int i=1;i<p.size();++i)
        {
            if(p[i]!=p[i-1])
            {
                Y[++cnty]=cnt;
                cnt=1;
            }
            else cnt++;
        }
        Y[++cnty]=cnt;
        if(cntx!=cnty)
        {
            cout<<"NO\n";
            continue;
        }
        bool flag=1;
        for(int i=1;i<=cntx;++i)
        {
            if(Y[i]<X[i])
            {
                flag=0;
                cout<<"NO\n";
                break;
            }
            if(Y[i]>X[i]*2)
            {
                flag=0;
                cout<<"NO\n";
                break;
            }
        }
        if(flag) cout<<"YES\n";
    }
    return 0;
}