NYOJ 290 字典树

题目链接: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值