Description
给出一个长度为
n
的序列
Input
第一行为一整数
n
表示序列长度,之后输入
Output
输出该序列的回文度
Sample Input
3
2 2 2
Sample Output
6
Solution
统计每个数字出现的次数
num[i]
,如果
num[i]
中有超过一个奇数则不可能回文,方案数为
0
,否则首先从两端开始往中间找已经回文的最长长度
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
int n,a[maxn],num[maxn],use[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),num[a[i]]++;
int flag=0;
for(int i=1;i<=n;i++)
if(num[i]&1)flag++;
if(flag>1)printf("0\n");
else
{
int pos=0;
for(int i=1;i<=n/2;i++)
if(a[i]!=a[n-i+1])
{
pos=i;
break;
}
else num[a[i]]-=2;
if(!pos)printf("%I64d\n",(ll)n*(n+1)/2);
else
{
int cnt=0;
for(int i=pos;i<=n;i++)
{
use[a[i]]++;
if(2*use[a[i]]>num[a[i]])
{
if(i<n-i+1||i==n-i+1&&num[a[i]]%2==0||a[i]!=a[n-i+1])break;
}
cnt++;
}
memset(use,0,sizeof(use));
for(int i=n-pos+1;i>=1;i--)
{
use[a[i]]++;
if(2*use[a[i]]>num[a[i]])
{
if(i>n-i+1||i==n-i+1&&num[a[i]]%2==0||a[i]!=a[n-i+1])break;
}
cnt++;
}
printf("%I64d\n",(ll)pos*(pos+cnt));
}
}
return 0;
}