Registration System CodeForces - 4C - map
Registration System CodeForces - 4C
有一个邮箱注册系统遵循以下规则:
当一个用户想要注册账号时,如果用户名没有被占用,那这个用户名就会被加入数据库中,注册成功。如果用户名已被占用,系统会自动给用户创建一个新的用户名,从 1 开始在原来用户名后面添加数字,比如用户想注册 name 这个用户名,但是系统已经有了,于是系统会自动查找 name1 是否注册,如果 name1 也注册了,那么会检查 name2 是否注册,直到找到一个没有注册过的用户名,帮用户自动注册。
Input
输入第一行是一个正整数n,表示有 n 个用户想要注册。
接下来 n 行,每行一个非空字符串(只由小写字母组成,长度不超过 32)表示每个用户想要注册的用户名。
1<=n<=1e5。
Output
输出有 n 行,每行一个答案表示对应的用户注册的结果。
如果直接注册成功,就输出 OK,否则就输出系统帮助用户注册的用户名。
Sample Input
4
abacaba
acaba
abacaba
acab
Sample Output
OK
OK
abacaba1
OK
分析
- map查询元素是否存在,二分确定要注册的账户,复杂度 O(nlogn)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10,INF=0x3f3f3f3f;
int main() {
// freopen("data.in", "r", stdin);
ios::sync_with_stdio(0);
string s; map<string,int> m;
int n; cin>>n;
while(n--) {
cin>>s;
if(m.count(s)==0) {
m[s]=1; cout<<"OK"<<endl;
} else {
int l=1, r=1e5;
while(l<r) {
int mid=l+r>>1;
stringstream ss; ss<<mid;
string temp=s+ss.str();
if(m.count(temp)==0) r=mid;
else l=mid+1;
}
stringstream ss; ss<<r;
string temp = s+ss.str(); m[temp]=1;
cout<<temp<<endl;
}
}
return 0;
}
- 为啥要二分,直接map映射不就行了(几天后再看,发现当时的想法很奇怪耶)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10,INF=0x3f3f3f3f;
int main() {
string s; map<string,int> mp;
int n; cin>>n;
while(n--){
cin>>s;
if(mp.count(s)==0) cout<<"OK"<<endl;
else cout<<s<<mp[s]<<endl;
mp[s]++;
}
return 0;
}

浙公网安备 33010602011771号