Abelian Period

来源:互联网 发布:ubuntu sd卡挂载 编辑:程序博客网 时间:2024/06/15 16:24
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 iocc(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(1T10), denoting the number of test cases.

In each test case, the first line of the input contains an integer n(n100000), denoting the length of the string.

The second line of the input contains n integers S1,S2,S3,...,Sn(1Sin), 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
265 4 4 4 5 486 5 6 5 6 5 5 6
 

Sample Output
3 62 4 8
 

Source

BestCoder Round #88

思路: 易知答案一定为n的因子,又因为n不是特别大,一一判断就行了;

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[110000],vis[110000];int temp[110000],temp1[110000];int n;int judge(int k){int cnt=0,i;for(i=0;i<k;i++)temp[cnt++]=a[i];sort(temp,temp+k);cnt=0;for(i=k;i<n;i++){temp1[cnt++]=a[i];if(cnt==k){sort(temp1,temp1+k);for(int j=0;j<k;j++){if(temp[j]==temp1[j])        continue;elsereturn 0;}cnt=0;}}return 1;}int main(){int t,i;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);//vis[a[i]]++;}int f=0;for(i=n;i>=1;i--){if(n%i==0){if(judge(n/i)==1){ if(f==0) printf("%d",n/i); else printf(" %d",n/i); f++;}}}printf("\n");}return 0;}


0 0
原创粉丝点击