#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
using namespace std;
const int N=1e5+20;
int a[N],num[N],ans[N];
map<int,int>t1,t2;//值和出现次数
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int cur=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(n%i==0)
{
num[++cur]=i;//循环长度为n的因子
}
}
int cnt=0;
//时间复杂度为 O(n*d(n))
for(int k=1;k<=cur;k++)
{
bool flag=true;
t1.clear();
for(int j=1;j<=num[k];j++)
{
t1[a[j]]++;
}
int y=n/num[k];//循环次数
for(int j=2;j<=y;j++)
{
t2=t1;//
int s=(j-1)*num[k]+1;//起点
int t=s+num[k]-1;//终点
for(;s<=t;s++)
{
t2[a[s]]--;
}
map<int,int>::iterator it;
for(it=t2.begin();it!=t2.end();it++)
{
if(it->second)//次数相等时为0
{
flag=false;
break;
}
}
if(!flag)
break;
}
if(flag)
ans[++cnt]=num[k];
}
for(int i=1;i<=cnt;i++)
{
cout<<ans[i];
if(i==cnt)
cout<<endl;
else
cout<<" ";
}
}
return 0;
}
hdu 5908 暴力(map)
最新推荐文章于 2019-05-22 19:45:24 发布