HDU5908-Abelian Period

来源:互联网 发布:盛科网络 营收 编辑:程序博客网 时间:2024/06/14 10:06

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 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

题意:设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;}

0 0
原创粉丝点击