#include<bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int vis[maxn], sc[maxn];
int n, p;
struct Node{
int hs;
char s[10];
}t[maxn];
int Hash(char *s){
int l = strlen(s), hs = 0, q = 1;
if(l>3){
for(int i = l-3; s[i]; i++){
hs = hs*32+ (s[i]-'A');
}
}
else{
for(int i = 0; s[i]; i++){
hs = hs*32 + (s[i]-'A');
}
}
//cout << hs << endl;
hs %= p;
//cout << hs << endl;
return hs;
}
int main(){
char s[10];
// sc[0] = 0;
// for(int i = 1; i <= 100; i++){
// if(i%2==0) sc[i] = -(i*i)/4;
// else sc[i] = (i+1)*(i+1)/4;
// }
scanf("%d%d",&n,&p); getchar();
for(int i = 0; i < n; i++){
scanf("%s",s);
//cout << s << endl;
int hs = Hash(s);
//cout << hs << ' ' << endl;
int tmp = hs,k=1;
if(vis[hs]){
if(strcmp(t[hs].s, s)!=0){
while(vis[hs]){
hs = (tmp+k*k)%p;
if(!vis[hs]){
vis[hs] = 1;
break;
}
else if(strcmp(t[hs].s, s)==0){
break;
}
hs = (tmp-k*k+p)%p;
if(!vis[hs]){
vis[hs] = 1;
break;
}
else if(strcmp(t[hs].s, s)==0){
break;
}
k++;
}
}
}
else vis[hs] = 1;
strcpy(t[hs].s, s);
if(i==0) printf("%d",hs);
else printf(" %d", hs);
}
printf("\n");
system("pause");
return 0;
}
/*
4 11
A A A A
4 11
ZZZZZZZ AAAAAAA A Z
3 0 1 4
*/
仅供参考 切勿抄袭
hang hang hang !!!