P10442 「MYOI-R3」字符串 题解

题目描述

给定字符串 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}Subtaskn\len≤特殊性质总分值
1110102525
2210^5105\text{A}A2525
3310^5105\text{B}B2525
4410^51052525

对于 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;
} 

 最后宣传一下我的弱谷

个人中心 - 洛谷

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值