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;
}

浙公网安备 33010602011771号