传送门
题目所述操作其实就是将一个环进行翻转然后再旋转,故总共有
2
n
2n
2n种可能的状态,哈希判重即可,注意要双模数防止被卡。
const int m1 = 1635947,m2=517619,c=100000;
int n,a[maxn<<1],cpow1[maxn],cpow2[maxn];
map<pi,bool>vis;
int solve(){
int hs1=0,hs2=0,ans=0;
FOR(i,0,n){
a[i+n]=a[i];
hs1=(1ll*hs1*c%m1+a[i])%m1;
hs2=(1ll*hs2*c%m2+a[i])%m2;
}
if(!vis[mk(hs1,hs2)])ans++;
vis[mk(hs1,hs2)]=1;
FOR(i,n,n<<1){
hs1=(hs1-1ll*a[i-n]*cpow1[n-1]%m1+m1)%m1;
hs2=(hs2-1ll*a[i-n]*cpow2[n-1]%m2+m2)%m2;
hs1=(1ll*hs1*c%m1+a[i])%m1;
hs2=(1ll*hs2*c%m2+a[i])%m2;
if(!vis[mk(hs1,hs2)]){
ans++;
vis[mk(hs1,hs2)]=1;
}
}
return ans;
}
int main(){
cpow1[0]=cpow2[0]=1;
FOR(i,1,maxn)cpow1[i]=1ll*cpow1[i-1]*c%m1,cpow2[i]=1ll*cpow2[i-1]*c%m2;
n=rd();
while(n){
FOR(i,0,n){
a[i]=rd();
}
vis.clear();
int ans=0;
ans+=solve();
reverse(a,a+n);
ans+=solve();
wrn(ans);
n=rd();
}
}