传送门:http://codeforces.com/problemset/problem/501/E
题意:给你n个数字a0,a2,...,an-1。(1<=ai<=n),随便去其中一段序列,随意调换位子,求使得整个字符串变成回文字符串个数?
分析:列举每种可能匹配的情况,分奇偶,注意中间位置
考虑周全就行了。。。。。代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int a[maxn],b[maxn],c[maxn];
int main()
{
int n,tot = 0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
if(b[a[i]]%2 == 1)
tot++;
else
tot --;
}
if(tot>1)
{
printf("0\n");
return 0;
}
int i;
for(i=0;i<n/2;i++)
{
if(a[i] == a[n-1-i])
b[a[i]] -= 2;
else
break;
}
if(i == n/2)
{
printf("%I64d\n",(long long)n*(n+1)/2);
return 0;
}
int l,r,cnt = 0;
l = i; r = n-1-i;
for(i=0;i<=n;i++) c[i] = 0;
for(i=l;i<=r;i++)
{
if(i<n/2)
{
c[a[i]] ++;
if(c[a[i]]<=b[a[i]]/2) cnt++;
else
break;
}
else
{
if(a[i] == a[n-1-i]&&(b[a[i]]%2||n%2==0)) cnt++;
else
break;
}
}
for(int i=0;i<=n;i++) c[i] = 0;
for(i=r;i>=l;i--)
{
if(i>n/2||(i==n/2&&n%2==0))
{
c[a[i]] ++;
if(c[a[i]]<=b[a[i]]/2)
cnt++;
else
break;
}
else
{
if(a[i] == a[n-1-i]&&(n%2==0||b[a[i]]%2)) cnt++;
else
break;
}
}
printf("%I64d\n",(long long)(l+1)*(l+cnt+1));
return 0;
}