C - One Time Swap
C - One Time Swap
https://atcoder.jp/contests/abc345/tasks/abc345_c
思路
组合计数,
假设字符串中所有位置的字符都不相同,求所有位置字符交换的组合数
对于相同字符的位置, 任意两个位置交换不会改变字符串
所以计算所有这种无效贡献
注意最后对所有的无效贡献,需要保留一个,对应唯一的一个字符串
https://zenn.dev/testcampus/articles/d8f6f4cc760fa0
Code
string s; int main() { cin >>s; long long len = s.size(); long long combtotal = (len*(len-1)) >> 1; // cout << "combtotal=" << combtotal << endl; long long cnt[26] = {0}; bool duplicate = false; for(char one: s){ cnt[one-'a']++; if (cnt[one-'a']>1){ duplicate = true; } } long long combduplicate = 0; for(int i=0; i<26; i++){ if (cnt[i] <=1){ continue; } long long charcnt = cnt[i]; long long combone = (charcnt*(charcnt-1)) >> 1; /* should not minus one here, because if two or more chars appears twice or more, even though every switch of one char only contribute once for example aa b cc aa switch and cc switch only count once. so every char counts 1 switch combduplicate = 2 but you need to keep one after counting all chars combduplicate - 1 */ // combone--; combduplicate += combone; } // cout << "combduplicate=" << combduplicate << endl; if (!duplicate){ cout << combtotal << endl; } else { long long ans = combtotal - (combduplicate - 1); cout << ans << endl; } return 0; }
出处:http://www.cnblogs.com/lightsong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2019-03-18 npm knowledge basics