题面:



解决思路和伪代码实现
将每个字母的数量记录一下,再去就计算所有字符串数量(映射 mp 存储)
对于每一个字母 a_{i} :
- 如果 mp[a_{i}] 大于
1,则得到原字符串S,会多一种可能的字符串,则答案需要+1 - 和其他未组合的字母 a_{j} (j>i) 进行“交换”,总共可以产生 mp[a_{i}] * mp[a_{j}] 个新的字符串
则伪代码为:
cin>>s;
for(auto it:s)++mp[it];
for(char it='a';it<='z';++it){
pd|=mp[it]>1;
for(char jt=it+1;jt<='z';++jt){
ans+=mp[it]*mp[jt];
}
}
cout<<ans+pd;

但是重点不是 AC 了,而是我交了一个错误的代码上去也过了:
cin>>s;
for(auto it:s)++mp[it];
for(char it='a';it<='z';++it){
for(char jt=it+1;jt<='z';++jt){
ans+=mp[it]*mp[jt];
}
}
cout<<ans+1;
很明显,样例的意思是 必须交换不同的字母 才能算作一次有效的操作
极端数据(如题目样例)每个字母都只含有一个时,应该无法通过交换得到原串 S
直接将 ans+1 是不行的
因此自测样例明显就过不去:

但是我却没有 WA ,测试数据全过了

至少把样例的数据写进测试数据里吧,不然太不严谨了