awoo's Favorite Problem (CF2C) (贪心找性质(抛去复杂的信息)

 

思路:

  • 这种明显先从贪心找性质进行处理,其他的不是马上能想到
  • 如是发现 a只能往后面移动
  • c只能往前面移动,
  • a和c不能交换顺序
  • 利用减法思维, 当2个数确定了, 那么b也就确定了
  • 其实这种贪心题, 一般就是要减法思维, 把一些难处理的地方,给他扔掉,开贪!!!
#include <bits/stdc++.h>
using namespace std;
#define ri int 
#define M 2000005

int n,m;
int T;
int a[M];
int b[M];
int c[M],d[M];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

   
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        string s,t;
        cin>>s>>t;
        vector<int>p[500];vector<int>q[500];
        for(ri i='a';i<='c';i++) a[i]=0,b[i]=0,p[i].clear(),q[i].clear();
        
    
        for(ri i=0;i<s.length();i++)
        a[s[i]]++,p[s[i]].push_back(i);
        for(ri i=0;i<t.length();i++)
        b[t[i]]++,q[t[i]].push_back(i);
        int flag=1;
        for(ri i='a';i<='c';i++)
        {
            if(a[i]!=b[i]) flag=0;
        }
        if(flag==0)
        {
            cout<<"NO\n";
            continue;
        }
        int l=0,r=0;
        for(ri i=0;i<n;i++)
        {
            if(s[i]=='a'||s[i]=='c') c[++l]=s[i];
            if(t[i]=='a'||t[i]=='c') d[++r]=t[i];
        }
        for(ri i=1;i<=r;i++)
        {
            if(d[i]!=c[i]) flag=0;
        }
        for(ri i=0;i<p['a'].size();i++)
        {
            if(p['a'][i]>q['a'][i]) flag=0;
        }
        for(ri i=0;i<p['c'].size();i++)
        {
            if(p['c'][i]<q['c'][i]) flag=0;
        }
        if(flag==0)
        {
            cout<<"NO\n";
        }else cout<<"YES\n";
     } 
    
    return 0;

}
View Code

 

posted @ 2023-03-08 00:48  VxiaohuanV  阅读(14)  评论(0编辑  收藏  举报