原题链接: https://codeforces.com/contest/2000/problem/C
题目大意:
给你一个长度为n的数字数组,然后给你m个字符串,对于每个字符串而言,如果符合以下三点:1.长度一样。2.数字相等的位置字符也相等。3.字符相等的位置数字也相等。那么就输出YES,否则输出NO
直接模拟即可,用结构体或者map可以直接写
对于如何判断这三个条件,第一个非常简单,判断size大小是否相同即可,如果相同则判断下面2个条件。
对于如何知道数字相等的地方字符也相等,可以对用结构体去存储数字和它的下标,那么就可以带着下标排序,进而知道相等的数字的下标,然后通过这些下标去找字符串中这两个字符是否相等,如果其中有一个不符就返回NO,第三条也是同样操作。
本题不难理解就是写写麻烦,用结构体去模拟的话代码会比较长,但是很好写,如下。
那么直接上代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,k;
struct node{
long long zhi;
int hao;
};
struct jiji{
char zhi;
int hao;
};
jiji vab2;
vector <jiji> b;
node vab;
vector <node> a;
vector <long long> c;
bool cmp(node x,node y){
if(x.zhi != y.zhi) return x.zhi < y.zhi;
else return x.hao < y.hao;
}
bool cmp2(jiji x,jiji y){
if(x.zhi != y.zhi) return x.zhi < y.zhi;
else return x.hao < y.hao;
}
int panduan1(string s){
for(int i=0;i<n-1;i++)
if(a[i].zhi == a[i+1].zhi)
if(s[a[i].hao] != s[a[i+1].hao])
return 0;
return 1;
}
int panduan2(int xh){
for(int i=0;i<n-1;i++)
if(b[i].zhi == b[i+1].zhi){
if(c[b[i].hao] != c[b[i+1].hao])
return 0;
}
return 1;
}
void solve(){
string s;
cin>>n;
a.clear(); c.clear();
for(int i=0;i<n;i++){
cin>>vab.zhi;
c.push_back(vab.zhi);
vab.hao = i;
a.push_back(vab);
}
sort(a.begin(),a.end(),cmp);
cin>>m;
while(m--){
b.clear();
cin>>s;
if(s.size() != a.size()){
cout<<"NO"<<endl;
continue;
}
for(int i=0;i<n;i++){
vab2.zhi = s[i];
vab2.hao = i;
b.push_back(vab2);
}
sort(b.begin(),b.end(),cmp2);
if(panduan1(s)==1 && panduan2(n)==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}