CodeForces-Making Anti-Palindromes

题目

这道题还是贪心贪得不太好,我的代码出现了这种情况

20
aabbccdxvssvxdccbbaa
5
我输出6

反思为什么输出6 我是先找出相等的 然后按照次数进行排序
然后开始一头一尾进行相互抵消 这就出问题了 aabb消耗了dxvs,代价为4 而cc还留着了 于是又找 又花2 等于6 实际上 aabb只要2的代价 真奇葩 我这代码还能跑完前四个测试点

正解其实是找到所有对数,设为cnt,于是我们找到最多的那一对的那个字母,如果发现*2<=cnt 说明靠他一起顺便抵消是不行的 只能是cnt/2当然别忘了向上取整 如果大于 说明可以顺便抵消

就这样吧

代码不放了

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
const int range=2e5+5;
int n;
string s;
int num[30];
void solve()
{
	cin>>n;	cin>>s;
	for(int i=1;i<=26;i++)num[i]=0;
	if(n%2){
		cout<<-1<<endl;
		return ;
	}
	int len=n;
	len=len/2;
	// 8 4  
	len--;
	int maxn=0;
	for(int i=0;i<=n-1;i++)
	{
		int x=s[i]-'a'+1;
		num[x]++;	
		maxn=max(num[x],maxn);
	}
	if(maxn>len+1){
		cout<<-1<<endl;
		return ;
	}
	int cnt=0;
	memset(num,0,sizeof num);
	for(int i=0;i<=len;i++)
	{
		if(s[i]==s[n-i-1])
		{
			int ch=s[i]-'a'+1;
			num[ch]++;
			cnt++;
		}
	}
	maxn=0;
	for(int i=1;i<=26;i++)
	{
		if(num[i]>maxn){
			maxn=num[i];
		}	
	}
	if(2*maxn<=cnt)
	{
		
		int ans=(cnt+2-1)/2;
		cout<<ans<<endl;
	}
	else {
		cout<<maxn<<endl;
		return ;
	}
}
posted @ 2025-04-16 19:57  LteShuai  阅读(4)  评论(0)    收藏  举报