int BKDRHash(char *str)
{
int seed = 131;
int hash = 0;
while (*str) hash = hash * seed + (*str++);
return (hash & 0x7FFFFFFF) % MAXN;
}
struct HashMap
{
int head[Hash + 10]; int next[maxn + 10]; int val[maxn + 10]; int ans[maxn + 10][31];
int pos[maxn + 10];
int size;
void init()
{
size = 0; memset(head, -1, sizeof(head));
}
int ask(int a[])
{
int t = 0;
for (int i = 0; i < k; i++) t += a[i];
int gg = (t%Hash + Hash) % Hash;
for (int i = head[gg]; i != -1; i = next[i]){
if (val[i] == t){
int flag = 0;
for (int j = 0; j < k; j++) {
if (ans[i][j] != a[j]) {
flag = 1; break;
}
}
if (flag == 0) return pos[i];
}
}
return -2;
}
void insert(int a[], int p)
{
int t = 0;
for (int i = 0; i < k; i++) t += a[i];
int gg = (t%Hash + Hash) % Hash;;
for (int i = head[gg]; i != -1; i = next[i]){
if (val[i] == t){
int flag = 0;
for (int j = 0; j < k; j++){
if (ans[i][j] != a[j]){
flag = 1; break;
}
}
if (flag == 0) return;
}
}
val[size] = t; next[size] = head[gg];
pos[size] = p;
for (int i = 0; i < k; i++) ans[size][i] = a[i];
head[gg] = size++;
}
}m;