#include <stdio.h>
#include <stdlib.h>

#define SIZE 100000 //根据需要更改
typedef struct node {
int n;
char str[501];
struct node * prev;
struct node * next;
}Node;

Node HashTable[SIZE];

Node HashPool[SIZE];
int HashIndex = 0;

Node * getNewNode(){
return &HashPool[HashIndex++];
}

void insertNode(int key, Node * newNode){
Node * head = &HashTable[key];

newNode->prev = head;
newNode->next = head->next;

head->next = newNode;
newNode->next->prev = newNode;
}

void initHash(int N){
HashIndex = 0; //reset hash pool
for(int i = 0; i < N; i++){
HashTable[i].prev = &HashTable[i];
HashTable[i].next = &HashTable[i];
}
}

int getKey(char str[501]){
int val = 0;
for(int i = 0; i < 10; i++){
val = val*26 + str[i] - 'a';
val %= SIZE;
}
return val;
}

bool same(char str1[], char str2[]){
for(int i = 0; i < 500; i++){
if(str1[i] != str2[i]) return false;
}
return true;
}

Node * searchNode(Node * node){
int key = getKey(node->str);
Node * x = HashTable[key].next;
while(x != &HashTable[key] && !same(x->str, node->str)){
x = x->next;
}
if(x != &HashTable[key])
return x;
else return NULL;
}

void deleteNode(Node * node){
node->prev->next = node->next;
node->next->prev = node->prev;
}


int main(){

initHash(SIZE);
int max = 1;
for(int i = 0; i < SIZE; i++){
Node * newNode = getNewNode();
newNode->n = 1;
for(int j = 0; j < 500; j++){
newNode->str[j] = rand() % 26 + 'a';
}

Node * tmpNode = searchNode(newNode);
if(tmpNode != NULL){
tmpNode->n++;
if(tmpNode->n > max) max = tmpNode->n;
}else{
int key = getKey(newNode->str);
insertNode(key, newNode);
}
}

printf("%d\n", max);
return 0;
}