HDU 5908 Abelian Period 可以直接用multiset

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

要求把数组分成k组使得每组中的元素出现次数相同

就是分成k个集合,那么直接用multiset判定就可以

有重载相等运算符的

我被坑了的就是,

对于2个元素一个集合的可以,那么,4,6,8这样分集合也是可以的。

这个很容易理解

但是,你也要能平均分才行啊

就是10的2可以,但是4是一定不可以得。不能平均分

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 100000 + 20;
int a[maxn];
multiset<int>aa;
multiset<int>bb;
set<int>ans;
void work() {
    aa.clear();
//    bb.clear();
    ans.clear();
    int n;
    scanf("%d", &n);
    bool flag = true;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        if (i >= 2 && a[i] != a[i - 1]) flag = false;
    }
    ans.insert(n);
    if (flag) {
        for (int i = 1; i <= n / 2; ++i) {
            if (n % i == 0) {
                ans.insert(i);
            }
        }
    } else {
        int begin = 1, end = -1;
        for (int i = 2; i <= n / 2; ++i) {
            if (n % i != 0) continue;
            if (ans.find(i) != ans.end()) continue;
//            aa.clear();
            end = i;
//            cout << begin << " " << end << " " << i << endl;
            for (int j = begin; j <= end; ++j) {
                aa.insert(a[j]);
            }
            begin = end + 1;
            flag = true;
            for (int j = 2 * i; j <= n; j += i) {
                bb.clear();
                for (int k = j; k >= j - i + 1; --k) {
                    bb.insert(a[k]);
                }
                if (aa != bb) {
                    flag = false;
                    break;
                }
            }
            if (!flag) continue;
            for (int j = i ; j <= n / 2; j += i) {
                if (n % j == 0) //10的2不代表10的4
                    ans.insert(j);
            }
        }
    }
//    show();
    set<int> :: iterator it = ans.begin();
    printf("%d", *it);
    it++;
    for (; it != ans.end(); ++it) {
        printf(" %d", *it);
    }
    printf("\n");
    return;
}

int main() {
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    int t;
    scanf("%d", &t);
    while(t--) work();
    return 0;
}

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 100000 + 20;
int a[maxn];
bool isok[maxn];
int n;
int cnt[maxn];
int cmp[maxn];
bool check(int val) {
    for (int i = 1; i <= val; ++i) {
        cnt[a[i]] = 0;
    }
    for (int i = 1; i <= val; ++i) {
        cnt[a[i]]++;
    }
    for (int i = 2 * val; i <= n; i += val) {
        for (int j = i; j >= i - val + 1; --j) {
            cmp[a[j]] = 0;
        }
        for (int j = i; j >= i - val + 1; --j) {
            cmp[a[j]]++;
        }
        for (int j = 1; j <= val; ++j) {
            if (cnt[a[j]] != cmp[a[j]]) return false;
        }
    }
    return true;
}
void work() {
    scanf("%d", &n);
    bool flag = true;
    memset(isok, 0, sizeof isok);
    isok[n] = 1;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        if (i >= 2 && a[i] != a[i - 1]) flag = false;
    }
    if (flag) {
        for (int i = 1; i <= n / 2; ++i) {
            if (n % i == 0) {
                isok[i] = 1;
            }
        }
    } else {
        for (int i = 2; i <= n / 2; ++i) {
            if (n % i != 0 || isok[i]) continue;
            if (check(i)) {
                for (int j = i; j <= n / 2; ++j) {
                    if (n % j == 0) isok[i] = 1;
                }
            }
        }
    }
    flag = 0;
    for (int i = 1; i <= n; ++i) {
        if (isok[i]) {
            if (!flag) {
                printf("%d", i);
                flag = 1;
            } else {
                printf(" %d", i);
            }
        }
    }
    printf("\n");
    return;
}

int main() {
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    int t;
    scanf("%d", &t);
    while(t--) work();
    return 0;
}
时间: 2024-10-15 01:54:10

HDU 5908 Abelian Period 可以直接用multiset的相关文章

HDU 5908 Abelian Period(暴力+想法题)

传送门 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 i, occ(u,i)=occ(w,i) always holds. i.e. (1,2,2,1,3)≍(1,3,

HDU 5908 Abelian Period (暴力)

题意:给定对于一个数字串S和一个正整数k,如果S可以分成若干个长度为k的连续子串,且这些子串两两匹配,那么我们称k是串S的一个完全阿贝尔周期. 给定一个数字串S,请找出它所有的完全阿贝尔周期.匹配就是含有相同的数字. 析:枚举k,首先k必须是 n 的约数,然后就能算出每个数字应该出现多少次. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <

hdu 5349 MZL&#39;s simple problem(multiset)

代码: #include<set> #include<cstdio> using namespace std; multiset<int> st; int main() { int n; multiset<int>::iterator it; while(scanf("%d",&n)==1) { st.clear(); int k,num; for(int i=0; i<n; i++) { scanf("%d&qu

每日学习笔记----js中可以直接用id名调用的问题?

在JavaScript中,标准的id选择器调用语法是: document.getElementById('myid').style.width = pc + "%"; 但是,今天发现,直接用id名字调用竟然也可以正确运行: myid.style.width = pc+"%"; 最后找度娘问了问. 看到Mrcxt的博客里面有这个问题,问题的答案是: 这个最初是 IE 里面的,后来 firefox chrome 好像也支持了. 不建议使用,这个不是标准里面的,将来不一定

configParse 模块直接用

#!/bin/env python #-*- coding:utf-8 -*- from ConfigParser import ConfigParser import json def getConfigObject(filename):     """获得配置文件对象     """     _config_ = ConfigParser()     _config_.read(filename)     return _config_ de

为什么是List_list_=_new_ArrayList()_而不直接用ArrayList

为什么是List list = new ArrayList(),而不直接用ArrayList? 编程是要面向对象编程,针对抽象(接口),而非具体.List 是接口,ArrayList是实现. 实现List接口的有ArrayList.LinkedList.Vector等,所以用哪个就直接new 一个接口实现 这是一种很好的设计模式.一个接口有多种实现,这种写法是java面向对象的一种思想,依赖倒置原则,即依赖于抽象不依赖于实现(具体). 给调用者提供的应该是接口或者抽象类,而实现者可以实现或者继承

配置Nginx防止直接用IP访问Web服务器

看了很多Nginx的配置,好像都忽略了ip直接访问Web的问题,这样理论上不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面. 官方文档中提供的方法: If you do not want to process requests with undefined "Host" header lines, you may define a default server that just drops the requests: server { li

如何在扫描完二维码后, 直接用Facebook App进到粉丝专页而不是网页版

假设我们推广了一枚二维码, 用户扫面二维码就用通过手机浏览器进入点专页,而不是facebook app, 是不是觉得很麻烦呢? 有没有办法解决呢?答案当然是有的! 一.取得Facebook粉丝专页id 代码 首先我们必须取得Facebook id 代码才能完成后面的动作,一般来说如果你的粉丝专页还没有取短网址的话, 你可以直接在网址列中就可以找到你的Facebook粉丝专页的id(如图红框所示) 但如果你已经取了短网址, 那你必须在网址列输入http://graph.facebook.com/{

Abelian Period

Abelian Period Accepts: 288 Submissions: 984 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) 问题描述 设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,