#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k;
long long ans, c;
multiset <int> s[200050];
multiset <int> :: iterator p;
int main(){
    scanf("%d", &n);
    for(i=1; i<=n; i++){
        scanf("%d", &k);
        s[k].insert(min(i, n-i+1));//离边界的距离、数量
        ans += (i>>1) * (n-i+1ll);//累加长度i字符串修改次数
    }//假设各不相同,每个串有一半字符需要修改
    for(i=1; i<=n; i++){
        c = s[i].size();
        for(p=s[i].begin(); p!=s[i].end(); p++){
            ans -= *p * --c;
        }//任意两个相同则不需要修改,减回去
    }//这两个相同的,被多少个回文串包含?取决于谁先到左右边界
    printf("%lld\n", ans);
    return 0;
}

作者 crxis

发表回复