状态数组st记录当前位置是否已存数。h数组记录存储的字符串。
注意:负数取模加p。考虑字符串长度不及3的情况。考虑重复字符串。
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e4+3;
int n, p;
char a[N], h[N][N];
bool st[N];
int main() {
cin >> n >> p;
while(n --) {
cin >> a;
int len = strlen(a), t = 0;
for(int i = 1; i <= 3; ++ i) {
if(len-i<0) break;
t += (a[len-i] - 'A')*pow(32, i-1);
}//cout << t << endl;
t = t % p;
int k = 1;
while(st[t] && strcmp(a, h[t]) != 0) {
int q = (t+k*k)%p;
if(!st[q])
t = q;
if(t!=q) {
q = (t-k*k + p) % p;
if(!st[q])
t = q;
}
++ k;
}
st[t] = true;
strcpy(h[t], a);
cout << t;
if(n) cout << ' ';
}
return 0;
}