刚写出来就去网上搜了一下发现很多都是map写的发现时间复杂度较高。
这道题用字典树时间更优(虽然浪费点内存,但是内存不值钱!!!)
只需要在每个名字末尾特判一下标记变量,是0就输出ok否则就在原来单词后面加个之前存在的数量。
最后再在末尾标记变量自增。
#include <bits/stdc++.h>
const int maxn=1e6+10;
using namespace std;
struct Tree
{
int point[26];
int num;
void init()
{
for(int i=0; i<26; i++)
point[i]=0;
}
} T[maxn];
int cur;
void Insert(string str,int value)
{
int cnt=0;
for(int i=0; i<str.size(); i++)
{
int x=str[i]-'a';
if(!T[cnt].point[x])
{
T[cur].init();
T[cur].num=0;
T[cnt].point[x]=cur++;
}
cnt=T[cnt].point[x];
}
if(T[cnt].num==0)
cout<<"OK"<<endl;
else
{
cout<<str<<T[cnt].num<<endl;
}
T[cnt].num+=value;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(false);
int t,n;
cin>>n;
T[0].init();
cur=1;
while(n--)
{
string str;
cin>>str;
Insert(str,1);
}
}