题解 CF518B

题解 CF518B

这个题最暴力的做法就是对于每个 \(s_i\) 都在 b 字符串里扫一遍

但是 \(s.len\leq 2\times 10^5\)

所以肯定过不了

但是我们思考一下,这里的字母对应其实可以看成一种映射对吧

所以我们可以直接用数组或者 STLmap 来做

每次我们扫一遍,找到所有可以直接匹配的

然后再扫两遍,分别处理大小写的情况

这里我们要注意我们已经匹配过的就不能再一次匹配了

#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;
}
posted @ 2022-11-30 09:14  Tyrue  阅读(12)  评论(0编辑  收藏  举报