题面
首先答案只有
−1,1,2
三种。
若
s
不为回文串,答案显然为
若
s
为回文串,假设答案
假设一二位相等,第一个出现的与第一位不同的字母不在正中间,即
aa...b...b...aa
,那么因为前缀
aa...b
不回文,那么后面一定回文,导致两个
b
中无论怎么放
假设一二位不等,即
ab...ba
,因为前缀
ab
不回文,所以导致必须是
abab...ba
,一直推下去就是
ababa......ababa
。
所以只要不是形如
aaa...aaa
(全相同),
aa...b...aa
(除正中间全相同),
ababa......ababa
(交替出现),答案均为2,否则为-1。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int n,ans,len[12];
char s[maxn],t[maxn],st[12][12];
bool check(char *s,int l,int r)
{
for(int i=l;i<=(l+r)>>1;i++)
if(s[i]!=s[r+l-i]) return 0;
return 1;
}
int spc2()
{
bool flag=1;
for(int i=1;i<=n/2;i++)
if(s[i]!=s[1]) {flag=0;break;}
for(int i=n-n/2+1;i<=n;i++)
if(s[i]!=s[1]) {flag=0;break;}
if(flag) return -1;
if(n&1)
{
flag=1;
for(int i=1;i<=n;i++)
{
if(i&1) {if(s[i]!=s[1]){flag=0;break;}}
else if(s[i]!=s[2]){flag=0;break;}
}
if(flag) return -1;
}
return 2;
}
int main()
{
int ca;
scanf("%d",&ca);
while(ca--)
{
scanf("%d%s",&n,s+1);
if(!check(s,1,n)) {puts("1"); continue;}
printf("%d\n",spc2());
}
return 0;
}