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; }