CF4C Registration system(哈希实现)
解题思路:因为这道题在每次输入一个字符串后,都需要进行一次查找以判断是否需要按照规则生成新的用户名,故这道题使用STL容器map进行哈希是最合适的(map的查找时间复杂度为log n),在题目描述中,如果用户名已经被注册,那我们必须找到一个合法的正整数i来产生新用户名,故我们可开一个vector记录字符串重复出现的次数,在字符串重复出现的情况下,我们输出字符串再输入vector记录的此字符串出现的次数即可。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin >> n;vector<int>num(100001);因为n最大为10的5次方,我们开成这个数即可。map<string,int>name;//定义一个map,用于存储字符串信息for(int i=0;i<n;i++){string str;cin >> str;//完成字符串的输入auto iter=name.find(str);//查找是否这个字符串在之前出现过,返回一个迭代器if(iter==name.end())//如果相等说明字符串未出现过,属于合法条件{name[str]=i;//创建一个键值对,map中有了此字符串的信息,i可以理解成它是第几次输入出现的字符串cout << "OK" << endl;//因为字符串之前未出现过,那么直接输出"OK"即可}else{int s=iter->second;//迭代器解引用得到的是一个pair类型,我们用->second访问字符串信息num[s]++;//记录这个字符串出现的次数cout << str << num[s] << endl;//输出按照规则生成的新用户名} }
}