P8270 [USACO22OPEN] Subset Equality S题解
题意
首先,给我们两个字符串,分别为 a-r 这些字符。然后给我们 abc 这个查询,我们应该判断 a,b,c 都提取出来,看是否相同。
思路
我们第一眼看到字符只能是 a-r 时,会想到为什么不是 a-z 呢?我们可以想到用 a-z 时的
step-1:预处理
我们设 a-r 中第 a 和 c ) 从
举个例子:
那么 a 和 c )从
step-2:处理询问。
现在我们对于每一个询问就很好处理了。设一个询问为
最后贴上代码
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int maxlen=200010;
char s[maxlen],t[maxlen],tmp[maxlen];
int q;
bool b[25][25];
int main(){
cin>>s>>t;
int lens=strlen(s),lent=strlen(t);
for(char i='a';i<='r';i++){
for(char j='a';j<='r';j++){
char strs[maxlen],strt[maxlen];
int cnts=0,cntt=0;
for(int k=0;k<lens;k++){
if(s[k]==i||s[k]==j)strs[cnts++]=s[k];
}
for(int k=0;k<lent;k++){
if(t[k]==i||t[k]==j)strt[cntt++]=t[k];
}
if(cnts!=cntt){b[(int)i-'a'][(int)j-'a']=1;continue;}
bool flag=0;
for(int k=0;k<cnts;k++){
if(strs[k]!=strt[k]){flag=1;}
}
b[(int)i-'a'][(int)j-'a']=flag;
}
}
scanf("%d",&q);
while(q--){
scanf("%s",tmp);
int len=strlen(tmp);
bool flag=0;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(b[tmp[i]-'a'][tmp[j]-'a']){flag=1;break;}
}
if(flag)break;
}
if(flag)printf("N");
else printf("Y");
}
return 0;
}```