HDU-5908-Abelian Period(暴力)

来源:互联网 发布:姚明生涯得分数据统计 编辑:程序博客网 时间:2024/06/06 09:09

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5908

题意:

SSS是一个数字串,定义函数occ(S,x)occ(S,x)occ(S,x)表示SSS中数字xxx的出现次数。例如:S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1。如果对于任意的iii,都有occ(u,i)=occ(w,i)occ(u,i)=occ(w,i)occ(u,i)=occ(w,i),那么我们认为数字串uuuwww匹配。例如:(1,2,2,1,3)(1,3,2,1,2)。对于一个数字串SSS和一个正整数kkk,如果SSS可以分成若干个长度为kkk的连续子串,且这些子串两两匹配,那么我们称kkk是串SSS的一个完全阿贝尔周期。给定一个数字串SSS,请找出它所有的完全阿贝尔周期。

题解:

直接用map暴力

CODE:

#include <bits/stdc++.h>//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define INF 0x3f3f3f3f#define LL long long#define bug cout<<"bug"<<endlconst int MAXN = 100007;const int MAXM = 20007;const int MOD = 1e9 + 9;using namespace std;int ans[MAXN],all;int a[MAXN],p[MAXN];int n;bool judge(int len){    map<int, int>cnt1, cnt2;    for(int i=0; i<len; ++i)        cnt1[ a[i] ]++;    for(int i=len; i<n; ++i)    {        if(i%len==0&&i>len)if(cnt1!=cnt2)return 0;        if(i%len==0)cnt2.clear();        cnt2[ a[i] ]++;    }    if(cnt1!=cnt2)return 0;    return 1;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=0; i<n; ++i)            scanf("%d",&a[i]);        int temp=0;        for(int i=1; i*i<=n; ++i)            if(n%i==0)            {                p[temp++]=i;                if(i*i!=n)p[temp++]=n/i;            }        sort(p,p+temp);        temp--;        all=0;        int all=0,k=0;        for(int i=0; i<temp; ++i)        {            k=0;            for(int j=0; j<all; ++j)            if(p[i]%ans[j]==0)            {                k=1;                ans[all++]=p[i];                break;            }            if(!k)            {                if(judge(p[i]))                    ans[all++]=p[i];            }        }        for(int i=0; i<all; ++i)            printf("%d ",ans[i]);        cout<<p[temp]<<endl;    }    return 0;}/*265 4 4 4 5 486 5 6 5 6 5 5 6*/


0 0
原创粉丝点击