哈希除重,但是哈希写搓了,其实这题因为循环只有1000次,不用哈希也能过,而且速度更快...代码很丑,也算是一个留念,记住,哈希的时候对数组memset会消耗大量时间!
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define N 10000007
int head[N],nn;
struct node{
int ele[16];
int next;
};
node p[1005];
unsigned long long po[20];
long long tt[100];
int Hash(node tmp,int n){
long long x=0,k=0,temp;
int ret;
for(int i=0;i<n;i++){
temp=tmp.ele[i];
while(1){
tt[k++]=temp%10;
temp/=10;
if(!temp){
break;
}
}
}
for(int i=0;i<k;i++){
x=(x+tt[i]*po[i%18])%N;
}
ret=x;
return x;
}
bool Search(int a,int has,int n){//查找,不成功则插入
bool flag=false;
for(int i=head[has];~i;i=p[i].next){
for(int j=0;j<n;j++){
if(p[a].ele[j]!=p[i].ele[j]){//如果不相同则查找想元素
break;
}
if(j==n-1){//如果全部相同
flag=true;
}
}
}
if(!flag){
p[a].next=head[has];
head[has]=a;
}
return flag;
}
void init(){
po[0]=1;
for(int i=1;i<18;i++){
po[i]=po[i-1]*10;
}
}
int main()
{
int t,n,tmp,times;
cin>>t;
bool flag,flag2;
//init();
node t1,t2;
while(t--){
times=1000;
cin>>n;
nn=0;
// memset(head,-1,sizeof(head));
for(int i=0;i<n;i++){
cin>>t1.ele[i];
}
//tmp=Hash(p[0],n);
p[0].next=head[tmp];
head[tmp]=0;
nn=1;
while(times--){
flag2=true;
for(int i=0;i<n;i++){
t2.ele[i]=abs(t1.ele[i]-t1.ele[(i+1)%n]);
if(p[nn].ele[i]!=0) flag2=false;//如果某一位不为0,则不是ZERO
}
if(flag2){
break;
}
t1=t2;
// tmp=Hash(p[nn],n);
//flag=Search(nn,tmp,n);
// if(flag){
// break;
// }
}
if(flag2) printf("ZERO\n");
else printf("LOOP\n");
}
return 0;
}