题解 CF518B
题解 CF518B
这个题最暴力的做法就是对于每个 \(s_i\) 都在 b
字符串里扫一遍
但是 \(s.len\leq 2\times 10^5\)
所以肯定过不了
但是我们思考一下,这里的字母对应其实可以看成一种映射对吧
所以我们可以直接用数组或者 STL
的 map
来做
每次我们扫一遍,找到所有可以直接匹配的
然后再扫两遍,分别处理大小写的情况
这里我们要注意我们已经匹配过的就不能再一次匹配了
#include<cstdio>
#include<string>
#include<iostream>
#include<map>
#define int long long
using namespace std;
string s,t;
const int N=1e6+10;
map<char,int> m;
int ay,y;
int vis[N];
signed main(){
cin>>s>>t;
int sl=s.size(),
tl=t.size();
for(int i=0;i<tl;i++){
m[t[i]]++;
}
for(int i=0;i<sl;i++){
if(m[s[i]]){
m[s[i]]--;
vis[i]=1;
y++;
}
}
for(int i=0;i<sl;i++){
if(m[s[i]+32] && s[i]>='A' && s[i]<='Z' && !vis[i]){
ay++;
m[s[i]+32]--;
vis[i]=1;
}
}
for(int i=0;i<sl;i++){
if(m[s[i]-32] && s[i]>='a' && s[i]<='z' && !vis[i]){
ay++;
m[s[i]-32]--;
vis[i]=1;
}
}
printf("%lld %lld",y,ay);
return 0;
}