CF1800D题解

本题主要做题方法:找规律

朴素的做法为暴力枚举每个新的字串再用 \(n^2\) 复杂度去判重,但是这样显然超时!

实际上,我们可以枚举每一个将要删除的连续子串,观察每次删除后剩的字符串的规律。当我们发现若一个将要删除的字符串如 \(\mathrm{ab}\) 时,若 \(\mathrm{ab}\) 前或其后又有一个 \(\mathrm{a}\),那么在这三个字符 \(\mathrm{aba}\) 中,无论我们删除哪个字串 \(\mathrm{ab}\),都会剩下一个相同的字符。这意味着,如果有相连的三个字符 \(s1\)\(s2\)\(s3\),如果 \(s1=s3\),那么这三个字符中的两种删除情况只会产生一种不同的字符串。对应到代码中,也就是把初始情况数减一。

初始情况数即为 \(n-1\) 种字符串。

AC code:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll T,n;
char c[200010];
signed main() {
	T=in();
	while (T--) {
		n=in();
		ll ans=n-1;
		for (ll i=1;i<=n;++i) cin>>c[i];
		for (ll i=1;i<=n-2;++i) {
			if (c[i]==c[i+2]) ans--;
		}
		cout<<ans<<endl;
	}
	return 0;
}

posted @ 2023-06-06 18:07  Pwtking  阅读(14)  评论(0)    收藏  举报