[题解]CF1822E Making Anti-Palindromes
思路
发现对于无解的情况,当且仅当同一种字符出现次数大于 或者 为奇数。
然后统计每一种有字符的冲突对数,记 表示字符 的冲突对数,并记 ,。
如果 ,说明你每一次操作都会使两种不同字符交换到可行的位置,所以答案为 。
否则,说明需要将 的这一种字符与其它字符交换,答案为 。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
int n;
int vis[50];
string s;
inline int up(int a,int b){
if (a % b == 0) return a / b;
return a / b + 1;
}
inline void solve(){
int Max = 0,ans = 0;
cin >> n >> s;
s = ' ' + s;
if (n & 1){
puts("-1");
return;
}
memset(vis,0,sizeof(vis));
for (re int i = 1;i <= n;i++){
vis[s[i] - 'a']++;
Max = max(Max,vis[s[i] - 'a']);
}
if (Max > n / 2){
puts("-1");
return;
}
memset(vis,0,sizeof(vis));
for (re int i = 1,j = n;i <= j;i++,j--){
if (s[i] == s[j]) vis[s[i] - 'a']++;
}
int cnt = 0,num = 0;
for (re int i = 0;i < 26;i++){
if (vis[i]){
cnt += vis[i];
num = max(num,vis[i]);
}
}
if (num * 2 <= cnt) printf("%d\n",up(cnt,2));
else printf("%d\n",num);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--) solve();
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18266715
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】