vector的哈希值 Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C

http://codeforces.com/contest/757/problem/C

题目大意:有n个导管,每个体育馆有k种神奇宝贝,然后所有的n个体育馆中,一共有m中神奇宝贝。可知,每个神奇宝贝中都可以相互转化。问,有多少种转化方式,使得每个体育馆里面的所有类型的数目不变(可以所有的不转化)

思路:我第一次知道vector竟然可以通过hash的方式来解决问题!!!

定义vector<int> ve[i]表示第i种神奇宝贝属于哪些道馆,然后我们sort(ve + 1, ve + 1 + m),再判断ve[i] == ve[i-1]即可。

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha
")
const int maxn = 1e6 + 5;
std::vector<int> ve[maxn];
const LL mod = 1e9 + 7;
int n, m;

int main(){
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++){
        int k; scanf("%d", &k);
        while (k--){
            int u; scanf("%d", &u);
            ve[u].push_back(i);
        }
    }
    std::sort(ve + 1, ve + 1 + m);
    LL ans = 1, cnt = 1;
    for (int i = 2; i <= m; i++){
        if (ve[i] == ve[i - 1]){
            ans = ans * (++cnt) % mod;
        }
        else cnt = 1;
    }
    std::cout << ans << std::endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/heimao5027/p/6430738.html