链接:点击打开链接
题意:给出n个数列,看是否能通过循环左移,循环右移,倒置,使得其中两个数列相同
代码:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD=99991;
int n;
int s[100005][6];
vector<int> G[100005];
int judge(int x,int y){
int i,j,sig,sig1;
for(i=0;i<6;i++){
sig=sig1=0;
for(j=0;j<6;j++){ //其实就是一个环,看两个环能否
if(s[x][(i+j)%6]!=s[y][j]) //顺时针或逆时针是一样的
sig=1;
if(s[x][(i-j+6)%6]!=s[y][j])
sig1=1;
}
if(sig==0||sig1==0)
return 1;
}
return 0;
}
int main(){
int i,j,sig,tmp;
while(scanf("%d",&n)!=EOF){
for(i=0;i<100000;i++)
G[i].clear();
sig=0;
for(i=1;i<=n;i++){
tmp=0;
for(j=0;j<6;j++){ //加和取余,hash出可能相同的
scanf("%d",&s[i][j]);
tmp+=s[i][j];
}
tmp%=MOD;
if(sig==0)
for(j=0;j<G[tmp].size();j++){ //其实可以构造数据使得n个数列的hash值相同
if(judge(i,G[tmp][j])){ //这样的话复杂度就变成了n^2,就叉掉这个算法了....
sig=1;
break;
}
}
G[tmp].push_back(i);
}
if(sig)
puts("Twin snowflakes found.");
else
puts("No two snowflakes are alike.");
}
return 0;
}