题解 翻转游戏
发现一个有效的最小区间 \([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;
}