hdu 5908 Abelian Period (枚举)

来源:互联网 发布:华为手机下载软件 编辑:程序博客网 时间:2024/05/20 22:02

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

首先长度i必需满足n%i==0,这样才能将字符串分成整数份。n<=100000,满足条件的i应该不多,写个小程序看看有多少个

#include <iostream>#include <cstdio>using namespace std;#define FOR(i,k,n) for(int i=k;i<n;i++)#define FORR(i,k,n) for(int i=k;i<=n;i++)#define N 100000int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int cnt=0;    FORR(i,1,N)    {        if(N%i==0)            printf("%d\n",i),cnt++;    }    printf("%d\n",cnt);    return 0;}
结果显示36个。

所以直接枚举所有的长度i,找出符合的

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define FOR(i,k,n) for(int i=k;i<n;i++)#define FORR(i,k,n) for(int i=k;i<=n;i++)#define scan(a) scanf("%d",&a)#define scann(a,b) scanf("%d%d",&a,&b)#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)#define mst(a,n)  memset(a,n,sizeof(a))#define ll long long#define N 100005#define mod 1000000007#define INF 0x3f3f3f3fconst double eps=1e-8;const double pi=acos(-1.0);vector<int> num;vector<int> ans;int cnt[N];int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int t;    scan(t);    while(t--)    {        mst(cnt,0);        num.clear();        ans.clear();        int n;        scan(n);        FOR(i,0,n)        {            int tmp;            scan(tmp);            if(cnt[tmp]==0)                num.push_back(tmp);            cnt[tmp]++;        }        FOR(i,1,n) //枚举所有长度i        {            if(n%i==0)            {                int j=n/i,flag=0;                FOR(k,0,num.size())                {                    int cur=num[k];                    if(cnt[cur]%j) //每一个数的个数都可以均分成j份,则满足条件                    {                        flag=1;                        break;                    }                }                if(!flag)                    ans.push_back(i);            }        }        ans.push_back(n);        FOR(i,0,ans.size())            printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');    }    return 0;}


0 0