题目链接: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 100000
int 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 0x3f3f3f3f
const 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;
}