【题目ID:20688】“让我们交换吧!”测试数据不严谨

题面:



解决思路和伪代码实现

将每个字母的数量记录一下,再去就计算所有字符串数量(映射 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 ,测试数据全过了

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

2 个赞