Hash
按照yyhdalao的话来说那就是看到什么学什么不用照着学,能学什么学什么。
所以今天领悟了一下hash(自己打的并不是很规范的吧,我感觉
找到A集合与B集合的关系由于集合中的数字过大所以要进行hash一下。
首先尝试定义一个mod然后开始%,这样使较大的数字存到桶里进行调用。但是数字过大可能两个数字同时%掉这个数字的话就可能一样的了。
这就是70分的原因,还有就是这道题没多少细节,水水就过去了。开始考虑怎么水过......
map吧直接两个数字开始绑定,然后进行比较,好方法!于是水过了这道题。。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iomanip> #include<ctime> #include<vector> #include<queue> #include<map> #include<stack> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=10000017; int n,m,x; int num=0,top=0; map<int,int>a; map<int,int>b; int c[maxn],d[maxn]; int main() { n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x; m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x; if(n>m) { int flag=0,u=0; for(int i=1;i<=m;i++) { if(a[d[i]]!=1)flag=1; if(a[d[i]]==1)u=1; } if(flag==0)printf("B is a proper subset of A\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } if(n<m) { int flag=0,u=0; for(int i=1;i<=n;i++) { if(b[c[i]]!=1)flag=1; if(b[c[i]]==1)u=1; } if(flag==0)printf("A is a proper subset of B\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } if(n==m) { int flag=0,u=0; for(int i=1;i<=n;i++) { if(a[d[i]]!=1)flag=1; if(a[d[i]]==1)u=1; } if(flag==0)printf("A equals B\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } return 0; }
可是时间虽然不超但是速度实在是太慢了,这个算法不优秀(尽管map足够优秀了
然后继续hash啊,拉链法搞一波,其实就是开一个邻接表即可。。。简单
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iomanip> #include<ctime> #include<vector> #include<queue> #include<map> #include<stack> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=10000017; int n,m,x; int num=0,top=0; map<int,int>a; map<int,int>b; int c[maxn],d[maxn]; int main() { n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x; m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x; if(n>m) { int flag=0,u=0; for(int i=1;i<=m;i++) { if(a[d[i]]!=1)flag=1; if(a[d[i]]==1)u=1; } if(flag==0)printf("B is a proper subset of A\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } if(n<m) { int flag=0,u=0; for(int i=1;i<=n;i++) { if(b[c[i]]!=1)flag=1; if(b[c[i]]==1)u=1; } if(flag==0)printf("A is a proper subset of B\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } if(n==m) { int flag=0,u=0; for(int i=1;i<=n;i++) { if(a[d[i]]!=1)flag=1; if(a[d[i]]==1)u=1; } if(flag==0)printf("A equals B\n"); if(flag==1&&u==1)printf("I'm confused!"); if(flag==1&&u==0)printf("A and B are disjoint"); } return 0; }
Perfectly AC!
想喝水时,仿佛能喝下整个海洋似的——这是信仰;等到真的喝起来,一共也只能喝两杯罢了——这是科学。
———— 契柯夫