传送门
//题意: 问可以将给定的一个序列, 划分成长度全为相同值的一些子串, 且每个子串中出现了的数的次数要相等.
//思路: 首先必须是n的约数才行. 那么枚举n的约数, 对于每一个约数, O(n)暴力扫一遍判定是否满足就行. 总的复杂度为O(n的约数个数*n). 需要注意一些, 在暴力判定两个串是否符合题意时, 用map是非常方便的. 这是map的一个骚操作, 记好了!!! 详见代码.
AC Code
/** @Cain*/
const int maxn = 1e3+5;
int cas=1;
int fac[maxn];
int a[maxn*100];
vector<int >ans;
int n;
bool ok(int x)
{
map<int ,int >mp1,mp2;
for(int i=1;i<=x;i++) mp1[a[i]]++;
for(int i=x+1;i<=n;i+=x){
mp2.clear();
for(int j=i;j<=i+x-1;j++) mp2[a[j]]++;
if(mp1 != mp2 ) return false;
//这样写就可以直接判这两个子串是否符合题意, 非常的方便, 省事!
}
return true;
}
void solve()
{
Fill(fac,0); ans.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int k = 0;
for(int i=1;i*i<=n;i++){
if(n%i == 0){
fac[k++] = i;
if(i*i != n) fac[k++] = n/i;
}
}
for(int i=0;i<k;i++){
//cout << fac[i] << endl;
if(ok(fac[i])) ans.push_back(fac[i]);
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++){
printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}
}