题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=290
由于测试数据很大,所以用hash也可以,但应该注意,cin,cout对时间影响比较大,应该换成scanf 与printf
先介绍字典树(Tire )的方法。
字典树采取的是用空间换时间的策略
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
struct node
{
int sum; //出现次数
node *next[26];
};
int search(char *s,node *T)
{
node *p,*q;
p=T;
int i=0,id,j;
while(s[i])
{
id=s[i]-'a';
if(p->next[id]==NULL) //如果分支为空,则另辟结点
{
q=new node;
q->sum=0;
for(j=0;j<26;++j)
q->next[j]=NULL;
p->next[id]=q;
}
p=p->next[id]; //继续沿分支寻找
++i;
}
(p->sum)++;
return p->sum; //结束时返回该字符串出现的次数
}
int main()
{
int n,i,max=0;
node *T=new node;
for(i=0;i<26;++i) { T->next[i]=NULL;T->sum=0;}
char temp[50],name[50];
cin>>n;
for(i=0;i<n;++i)
{
cin>>temp;
int num=search(temp,T);
if(num>max)
{
max=num;
strcpy(name,temp);
}
}
cout<<name<<" "<<max<<endl;
system("pause");
return 0;
}