原题:https://pintia.cn/problem-sets/15/problems/890
0 | sample 1 无冲突 | 答案正确 | 6 | 4 ms | 452 KB |
1 | sample 2 有冲突 | 答案正确 | 8 | 5 ms | 320 KB |
2 | 有重复关键字 | 答案正确 | 3 | 5 ms | 448 KB |
3 | 最大和最小字符串,以及不足3位的字符串 | 答案错误 | 0 | 5 ms | 324 KB |
4 | 最大N,随机 | 答案正确 | 5 | 6 ms | 324 KB |
整了半天,也调试了许多例子,愣是没发现哪里错了。。
暂且搁着,等有缘人相助。。
#include<iostream>
#include<string>
#include<math.h>
#include<map>
using namespace std;
map <string, int> mp;
int vis[1010];
int ch(char op) { return op - 'A'; }
int main()
{
int n, p;
cin >> n >> p;
string s;
for (int i = 0; i < n; i++)
{
cin >> s;
if (mp.count(s))//如果这个名字用过了
{
if (i > 0)cout << " ";
cout << mp[s];
continue;
}
int nums = 0;
int len = s.size()-1;
//这里明明处理了小于三位的字符串啊。怎么就是过不了
if (len == 0)nums = ch(s[0]);
else if (len == 1)nums = ch(s[0]) * 32 + ch(s[1]);
else nums = ch(s[len - 2]) * 32 * 32 + ch(s[len - 1]) * 32 + ch(s[len]);
nums = nums % p;
int I = nums, info = 1,t=1;
while (vis[I] == 1 )//当位置有人占着,平方探测法
{
I = (nums + info) % p;
info = -info;
if (info > 0)
{
t++;
info = t*t;
}
}
vis[I] = 1;
mp[s] = I;
if (i != 0)cout << " ";
cout << mp[s];
}
return 0;
}