给你一个字符串 S。请计算以下操作恰好执行一次所能得到的字符串数。
- 设 N 是 S 的长度。选择一对整数(i,j)使得 1≤i<j≤ N和S 的第i 和 第j个 字符互换
可以证明,在这个问题的约束条件下,你总是可以完成这个操作的。
输入
S
输出
执行操作所产生的字符串数
样例输入1
abc
样例输出1
3
样例输入2
aaaaa
样例输出2
1
提示/说明
【限制因素】
- S是长度在2到10^6之间的字符串,包含小写英文字母
【样例一解释】
S 的长度为 3 ,因此 1≤i<j≤3满足三对整数(i,j):(1,2)、(1,3)和(2,3)
- 将S的第1个和第2个 字符对调,得出S是"bac"
- 交换S的第1和 3个字符,结果S是"cba"。
- 交换 S的第2和 3个字符,结果S是"acb"
因此,对 abc进行操作的结果是三个字符串中的一个:bac、cba和acb,所以打印 3
标签
普及 atcoder 排列组合
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
int sum1[1000005][30];
signed main(){
cin.tie();
cout.tie();
cin>>s;
int len1=s.length();
s=' '+s;
for(int i=1;i<=len1;i++){
sum1[i][s[i]-'a']=1;
for(int j=0;j<=26;j++)
sum1[i][j]+=sum1[i-1][j];
}
int ans=0;
for(int i=1;i<=len1;i++){
ans+=i-sum1[i][s[i]-'a'];
}
for(int i=0;i<26;i++){
if(sum1[len1][i]>1){
ans++;
break;
}
}
cout<<ans;
return 0;
}