AT_agc019_b 题解

洛谷链接&Atcoder 链接

1|0题目简述

给定一个字符串 A,可以选择区间 [i,j] 翻转一次,求能得到多少本质不同的字符串。(A 的长度不超过 2×105)。

2|0思路

首先解释本质不同的含义,即不完全相等的两个字符串(可能 AB 的字串)。

如果想直接求得答案显然是不现实的(虽然可求)。那么可以想到正难则反,既然求本质不同的字符串难求,则可求总方案数和本质相同的方案数并相减即可。

可以发现,如 stri1=strj+1,则区间 [stri,strj] 与区间 [stri1,strj+1] 的字串本质相同,故只能算一种方案。

总方案数为 n×(n1)2,其中 n 为字符串 A 的长度,其次本质相同的方案数即为每种字母中选两个的方案数总和,具体体现为 ai×(ai1)2

下面是代码实现:

#include<iostream> #include<cstring> using namespace std; long long num[30]; // 记得开 long long! string str; int main() { cin >> str; long long n = str.size(); for(int i = 0; i < n; i ++) num[int(str[i] - 'a')] ++; // 预处理字母个数。 long long ans = n * (n - 1) / 2; // 总方案数。 for(int i = 0; i < 26; i ++) ans -= num[i] * (num[i] - 1) / 2; // 减去本质相同的方案数。 cout << ans + 1 << endl; // 要加上本身! return 0; }

因为洛谷提交不了,所以放上官网的提交记录:

The End!


__EOF__

本文作者So_noSlack
本文链接https://www.cnblogs.com/So-noSlack/p/17736360.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   So_noSlack  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示