• bzoj4264: 小C找朋友


    hash大法好

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #define ll long long
    #define N 1000006
    #define M 2000006
    
    using namespace std;
    using std::vector;
    inline int read(){
    	int ret=0;char ch=getchar();
    	while (ch<'0'||ch>'9') ch=getchar();
    	while ('0'<=ch&&ch<='9'){
    		ret=ret*10-48+ch;
    		ch=getchar();
    	}
    	return ret;
    }
    
    vector<int> e[N];
    int n,m;
    
    struct Hash{
    	int k,P;
    	int hash[N];
    	Hash(){}
    	void load(){
    		memset(hash,0,sizeof(hash));
    		for (int i=1;i<=n;++i)
    			for (int j=0;j<e[i].size();++j)
    				hash[i]=(ll)((ll)hash[i]*k%P+e[i][j])%P;
    	}
    } h0,h1;
    
    pair<int,int> a[N];
    
    ll ans;
    void renew_ans(){
    	for (int i=1;i<=n;++i)
    		a[i]=make_pair(h0.hash[i],h1.hash[i]);
    	sort(a+1,a+n+1);
    	int cnt=0;
    	for (int i=1;i<=n;++i){
    		++cnt;
    		if (i==n||a[i]!=a[i+1]){
    			ans+=(ll)cnt*(cnt-1)/2;
    			cnt=0;
    		}
    	}
    }
    
    int main(){
    	h0.k=23;h0.P=2333333;
    	h1.k=233;h1.P=1000000007;
    	n=read();m=read();
    	for (int i=1;i<=m;++i){
    		int u=read(),v=read();
    		e[u].push_back(v);
    		e[v].push_back(u);
    	}
    	
    	ans=0;
    	for (int k=0;k<2;++k){
    		for (int i=1;i<=n;++i) sort(e[i].begin(),e[i].end());
    		h0.load();h1.load();
    		renew_ans();
    		for (int i=1;i<=n;++i) e[i].push_back(i);
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    Charles抓包使用教程
    学习规划
    log重复数据
    CNN实现推特文本分类
    conda env
    matplotlib画基础表
    决策树算法
    sklearn实现决策树
    分词与文本预处理工具
    matplotlib作图学习(1)
  • 原文地址:https://www.cnblogs.com/wangyurzee7/p/5181774.html
Copyright © 2020-2023  润新知