这题目写了一上午,一直错,然后自己测试数据还都对。为什么呢,为什么呢,后来我才发现代码里有一行free(tmp)。。。在55行那里。。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#define mod 999983
using namespace std;
struct node{
int num[];
node *next;
}p[mod];
int sign[mod];
int cmp_1(node *a,node *b,int pos){
int i,j=pos;
for(i=;i<;++i){
if(a->num[i]!=b->num[j])
return ;
j=(j+)%;
}
return ;
}
int cmp_2(node *a,node *b,int pos){
int i,j=pos;
for(i=;i<;++i){
if(a->num[i]!=b->num[j])
return ;
j=(j-+)%;
}
return ;
}
int cmp(node *a,node *b){
int i,j;
for(i=;i<;++i){
if(cmp_1(a,b,i)==||cmp_2(a,b,i)==)
return ;
}
return ;
}
int main(){
node *tmp;
node *op;
int key;
int success;
tmp=(node *)malloc(sizeof(node));
int i,j,n,cnt;
while(~scanf("%d",&n)){
memset(sign,,sizeof(sign));
success=;
for(i=;i<mod;++i){
p[i].next=NULL;
for(j=;j<;++j) p[i].num[j]=;
} for(cnt=;cnt<n;++cnt){
//free(tmp);
key=;
tmp=(node *)malloc(sizeof(node));
for(i=;i<;++i){
scanf("%d",&tmp->num[i]);
key+=tmp->num[i];
key=key%mod;
}
if(success==) continue;
tmp->next=NULL;
key=key%mod;
if(sign[key]==){
p[key]=*tmp;
sign[key]=;
}else if(sign[key]==){
op=&p[key];
while(){
if(cmp(op,tmp)==){
success=;
break;
}
if(op->next==NULL) break;
op=op->next;
}
if(success) continue;
op->next=tmp;
}
}
if(success==) printf("Twin snowflakes found.\n");
else printf("No two snowflakes are alike.\n"); }
return ;
}