每个节点记录以其为结尾的输入字符串输入次数,以其为前缀的当输出字符串,以其为前缀当输出字符串的输入次数,该节点父节点和子节点,维护这些变量,边插入边输出即可。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct T
{
string s;
int cnt;
int ccnt;
T * next[26];
T * fa;
T()
{
ccnt=0;
cnt=0;
for (int i=0;i<26;i++)
next[i]=NULL;
}
}* root;
int idx(char c)
{
return c-'a';
}
void insert(string s)
{
T * p=root;
int l=s.length();
int i,id;
for (i=0;i<l;i++)
{
id=idx(s[i]);
if (p->next[id]==NULL)
p->next[id]=new T;
p->next[id]->fa=p;
p=p->next[id];
}
p->ccnt++;
string s1=p->s;
if (p->cnt<=p->ccnt)
{
if (p->cnt<p->ccnt)
{
p->s=s;
p->cnt=p->ccnt;
s1=s;
}
int c=p->cnt;
while (p->fa!=NULL)
{
p=p->fa;
if ((p->cnt>c)||(p->cnt==c&&p->s<s))
break;
p->cnt=c;
p->s=s;
}
}
cout<<s1<<endl;
}
int main()
{
int n;
cin>>n;
string s;
root=new T;
root->fa=NULL;
for (int i=1;i<=n;i++)
{
cin>>s;
insert(s);
}
return 0;
}