需要注意的就是冲突的处理那部分,数据结构课本上的知识,运用 平方探测法解决
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<set> #include<map> using namespace std; const int maxn = 1000000 + 7, INF = 0x7f7f7f7f, mod = 1e9+7; int n, m; string s;// t; map<string, int> mp; bool vis[maxn] = {false}; int main() { scanf("%d %d", &n, &m); for(int i = 1; i <= n; ++i) { cin >> s; int len = s.size(); int num = 0; if(len == 1) { num += (s[0]-'A'); } else if(len == 2) { num = 32*(s[0]-'A') + (s[1]-'A'); } else { for(int j = 3; j >= 1; --j) { int pos = len - j; num = num * 32 + s[pos] - 'A'; } } num %= m; if(mp[s] == 0 && vis[num]) { for(int t = 1; t < maxn; ++t) { if(!vis[(num+t*t)%m]) { num = (num+t*t)%m; vis[num] = true; mp[s] = num; cout << num; break; } else if(!vis[(num-t*t+m)%m]) { num = (num-t*t+m)%m; vis[num] = true; mp[s] = num; cout << num; break; } } } else { num %= m; mp[s] = num; cout << num; vis[num] = true; } if(i < n) cout << " "; else cout << endl; } return 0; }