题解 翻转游戏

传送门

发现一个有效的最小区间 \([l, r]\) 满足 \(a_l\neq a_r\)
于是dp即可

Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 3000010
#define ll long long
//#define int long long

int n;
char s[N];

namespace force{
	string str;
	map<string, bool> mp;
	string rev(int l, int r) {
		--l; --r;
		string t=str;
		while (l<r) swap(t[l], t[r]), ++l, --r;
		return t;
	}
	void solve() {
		for (int i=1; i<=n; ++i) str+=s[i];
		for (int i=1; i<=n; ++i) {
			for (int j=i; j<=n; ++j) {
				mp[rev(j-i+1, j)]=1;
			}
		}
		printf("%d\n", int(mp.size()));
		exit(0);
	}
}

namespace task1{
	ll ans;
	bool isrev(int l, int r) {
		while (l<r)
			if (s[l]!=s[r]) return 0;
			else ++l, --r;
		return 1;
	}
	bool least_nrev(int l, int r) {
		return s[l]!=s[r];
	}
	void solve() {
		ans=1;
		for (int i=2; i<=n; ++i) {
			for (int j=i; j<=n; ++j) {
				// if (!isrev(j-i+1, j)) ++ans;
				if (least_nrev(j-i+1, j)) ++ans;
			}
		}
		printf("%lld\n", ans);
		exit(0);
	}
}

namespace task2{
	ll cnt[35], ans=1, sum;
	void solve() {
		for (int i=1; i<=n; ++i) {
			ans+=sum-cnt[s[i]-'a'];
			++cnt[s[i]-'a'];
			++sum;
		}
		printf("%lld\n", ans);
		exit(0);
	}
}

signed main()
{
	freopen("turn.in", "r", stdin);
	freopen("turn.out", "w", stdout);

	scanf("%s", s+1);
	n=strlen(s+1);
	// force::solve();
	task2::solve();

	return 0;
}
posted @ 2021-11-06 21:33  Administrator-09  阅读(0)  评论(0编辑  收藏  举报