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;
}
posted @ 2022-09-29 16:05  HelloHeBin  阅读(82)  评论(0)    收藏  举报