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

浙公网安备 33010602011771号