Abelian Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 455 Accepted Submission(s): 198
Problem Description
Let
S
be a number string, and
occ(S,x)
means the times that number
x
occurs in
S
.
i.e. S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1 .
String u,w are matched if for each number i , occ(u,i)=occ(w,i) always holds.
i.e. (1,2,2,1,3)≈(1,3,2,1,2) .
Let S be a string. An integer k is a full Abelian period of S if S can be partitioned into several continous substrings of length k , and all of these substrings are matched with each other.
Now given a string S , please find all of the numbers k that k is a full Abelian period of S .
i.e. S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1 .
String u,w are matched if for each number i , occ(u,i)=occ(w,i) always holds.
i.e. (1,2,2,1,3)≈(1,3,2,1,2) .
Let S be a string. An integer k is a full Abelian period of S if S can be partitioned into several continous substrings of length k , and all of these substrings are matched with each other.
Now given a string S , please find all of the numbers k that k is a full Abelian period of S .
Input
The first line of the input contains an integer
T(1≤T≤10)
, denoting the number of test cases.
In each test case, the first line of the input contains an integer n(n≤100000) , denoting the length of the string.
The second line of the input contains n integers S1,S2,S3,...,Sn(1≤Si≤n) , denoting the elements of the string.
In each test case, the first line of the input contains an integer n(n≤100000) , denoting the length of the string.
The second line of the input contains n integers S1,S2,S3,...,Sn(1≤Si≤n) , denoting the elements of the string.
Output
For each test case, print a line with several integers, denoting all of the number
k
. You should print them in increasing order.
Sample Input
2 6 5 4 4 4 5 4 8 6 5 6 5 6 5 5 6
Sample Output
3 6 2 4 8
Source
题意:设S是一个数字串,函数occ(S,x)occ(S,x)表示S中数字x的出现次数。如果对于任意的i,都有occ(u,i)=occ(w,i)occ(u,i)=occ(w,i),那么数字串u和w匹配。对于一个数字串S和一个正整数k,如果S可以分成若干个长度为k的连续子串,且这些子串两两匹配,那么k是串S的一个完全阿贝尔周期。给定一个数字串S,找出它所有的完全阿贝尔周期。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int main()
{
int t,n;
int a[100090],x[100090],b[100090],c[100090];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
int sum=0;
for(int i=1; i<=n/2; i++)
{
if(n%i==0)
{
for(int j=1;j<1+i;j++)
b[j-1]=a[j];
sort(b,b+i);
int k=0,flag=1;
for(int j=i+1;j<=n;j++)
{
c[k++]=a[j];
if(k==i)
{
sort(c,c+i);
for(int p=0;p<i;p++)
{
if(c[p]!=b[p]) {flag=0;break;}
}
k=0;
}
if(!flag) break;
}
if(flag) x[sum++]=i;
}
}
for(int i=0; i<sum; i++)
printf("%d ",x[i]);
printf("%d\n",n);
}
return 0;
}