题目描述
给定字符串 s,ts,t。
现在你要在 s,ts,t 中删除一些字符并将它们重新排列使 s=ts=t。
问操作后的 |s|∣s∣(即字符串 ss 的长度)最大是多少?
输入格式
第一行一个字符串 ss。
第二行一个字符串 tt。
输出格式
一行一个整数,表示操作后的 |s|∣s∣ 的最大值。
输入输出样例
输入 #1复制
abc bc
输出 #1复制
2
输入 #2复制
aaaaa bbbbb
输出 #2复制
0
说明/提示
在第一个样例中,将 a
删除,留下 bc
。
此时 |s|=2∣s∣=2,可以证明这是最优解。
在第二个样例中,将 aaaaa
删除,留下空串。 将 bbbbb
删除,留下空串。
此时 |s|=0∣s∣=0,可以证明这是最优解。
本题采用捆绑测试。
记 n=\max(|s|,|t|)n=max(∣s∣,∣t∣)。
\text{Subtask}Subtask | n\len≤ | 特殊性质 | 总分值 |
---|---|---|---|
11 | 1010 | 无 | 2525 |
22 | 10^5105 | \text{A}A | 2525 |
33 | 10^5105 | \text{B}B | 2525 |
44 | 10^5105 | 无 | 2525 |
对于 100\%100% 的数据,1 \le |s|,|t| \le 10^51≤∣s∣,∣t∣≤105,字符串均由小写字母组成。
特殊性质 \text{A}A:ss 是一个 \text{a}\sim\text{z}a∼z 的排列。
特殊性质 \text{B}B:保证 s_i,t_i\in\{\text{a},\text{b} \}si,ti∈{a,b}。
题目解释
贪心题
算是个比较水的题(不过通过率有点低)
我们每次对于每种字符,比较 ss 中出现次数和 tt 中出现次数取最小值,求和即可(正确性是因为可以重排,因此删多的即可)
枚举每种字符暴力实现即可
题解如下(我知道有人只看这里)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char a[N],b[N];
int ans,n,s[28],s2[28];
int main()
{
cin>>a;
cin>>b;
n=max(strlen(a),strlen(b));
ans=n;
if(strlen(a)==n)
{
for(int i=0;i<n;i++) s[a[i]-'a'+1]++;
for(int i=0;i<strlen(b);i++) s2[b[i]-'a'+1]++;
for(int i=1;i<=26;i++) if(s[i]-s2[i]>=0) ans-=s[i]-s2[i];
}
else
{
for(int i=0;i<n;i++) s[b[i]-'a'+1]++;
for(int i=0;i<strlen(a);i++) s2[a[i]-'a'+1]++;
for(int i=1;i<=26;i++) if(s[i]-s2[i]>=0) ans-=s[i]-s2[i];
}
cout<<ans<<endl;
return 0;
}
最后宣传一下我的弱谷