S 橙T1 wa了四个 求hack
  • 板块学术版
  • 楼主Ithea686
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/21 22:09
  • 上次更新2023/11/2 12:06:03
查看原帖
S 橙T1 wa了四个 求hack
756747
Ithea686楼主2023/10/21 22:09
#include <iostream>
#include <cstdio>
#include <tr1/unordered_map> 
using namespace std;

const int mod=10;
int n;
int arr[15][5];
int cnt[5];
bool ext[10];
bool ok[5];
int ans,res,p;
tr1::unordered_map<int,int> mp;

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		for (int j=0;j<5;j++) 
			{scanf("%d",&arr[i][j]);}
	}
	ans=5;
	for (int k=0;k<5;k++) {//判断是否全一样 
		for (int kk=0;kk<10;kk++) ext[kk]=0;//判断哈希
		ok[k]=1;//可以 
		ext[arr[1][k]]=1;
		cnt[k]=1;//不一样的个数 
		for (int i=2;i<=n;i++){
			if (!ext[arr[i][k]]) {//不一样 
				cnt[k]++;
				ok[k]=false;
				ext[arr[i][k]]=1;
			}
		}
		if (!ok[k]) p=k,ans--;//记录最后一个不一样的 
	}
	if (ans==5) {
		res+=81;
	}
	else if (ans==3||ans==4){//不如哈希 
		if (ans==3) {
			for (int i=0;i<=99;i++ ) mp[i]=0; 
			for (int i=1;i<=n;i++){
				int hs=-1,hss=0;
				for (int j=0;j<5;j++){
					if (cnt[j]!=1) {
						if (hs!=-1) hss=arr[i][j];
						else hs=arr[i][j];
					}
				}
				int mo=(hs-hss+mod)%mod;
				for (int j=0;j<=99;j++){
						//改变十位                改变两位                                            改变个位 
					if ((j%mod==hss&&j/10!=hs)||(j/10!=hs&&j%mod!=hss&&((j/10-j%mod)+mod)%mod==mo)||(j/10==hs&&j%mod!=hss)) mp[j]++;
				}
			}
			for (int i=0;i<=99;i++ ) if (mp[i]==n) res++;
		}
		else {
			//前
			if (p!=0) {
				for (int i=0;i<=99;i++ ) mp[i]=0; 
				for (int i=1;i<=n;i++){
					int hs=arr[i][p-1],hss=arr[i][p];
					int mo=(hs-hss+mod)%mod;
					for (int j=0;j<=99;j++){
							//改变十位                改变两位                                         改 变个位 
						if ((j%mod==hss&&j/10!=hs)||(j/10!=hs&&j%mod!=hss&&((j/10-j%mod)+mod)%mod==mo)||(j/10==hs&&j%mod!=hss)) mp[j]++;
					}
				}
				for (int i=0;i<=99;i++ ) if (mp[i]==n) res++;
			}
			if (p!=4) {
				for (int i=0;i<=99;i++ ) mp[i]=0; 
				for (int i=1;i<=n;i++){
					int hs=arr[i][p],hss=arr[i][p+1];
					int mo=(hs-hss+mod)%mod;
					for (int j=0;j<=99;j++){
							//改变十位                改变两位                                           改变个位 
						if ((j%mod==hss&&j/10!=hs)||(j/10!=hs&&j%mod!=hss&&((j/10-j%mod)+mod)%mod==mo)||(j/10==hs&&j%mod!=hss)) mp[j]++;
					}
				}
				for (int i=0;i<=99;i++ ) if (mp[i]==n) res++;
			}
		}
	}
	else if (ans<3) {//不能只转两个 
		printf("%d\n",res);exit(0);
	}
//	for (int i=1;i<=99;i++) printf("%d:%d\n",i,mp[i]);
	printf("%d\n",res);
	
	return 0;
} 
2023/10/21 22:09
加载中...