AT_abc345_c的题解

(一)

首先交换相同字符不改变字符串形态,那么就先统计是否有相同字符。

交换不同字符容易证明不同操作后字符串各不相同。

用前缀和或后缀和维护 \(i+1\)\(n\) 中与 \(i\) 位置字符不同的数量。

(二)

AC 代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
char ch[1000010];
int vis[1000010][27],ans,n;
signed main(){
	scanf("%s",ch+1);
	n=strlen(ch+1);
	for(int i=1;i<=n;i++){
		memcpy(vis[i],vis[i-1],sizeof vis[i]);
		vis[i][ch[i]-'a']++;
	}
	bool op=0;
	for(int i=1;i<=n;i++){
		int pos=ch[i]-'a';
		if(vis[n][pos]>vis[i][pos])op=1;
		ans+=n-i-(vis[n][pos]-vis[i][pos]);
	}
	printf("%lld\n",ans+op);
	return 0;
}
posted @ 2024-03-27 12:19  Jerry_heng  阅读(27)  评论(0)    收藏  举报