pku2138

给定一组单词,和一个起始单词,寻找有该单词每次添加一个字母都能构成该单词组中的某个单词,求能够成的最长的单词。采用队列实现的广搜方法,先将单词按长度排列,从起始单词的长度开始,对于每一个可能的单词放入队列,然后从长度比它大一的单词中找是否存在有它构成的,有放入序列,继续,直到队列为空。

Source:

 

#include < map >
#include
< queue >
#include
< string >
#include
< algorithm >
#include
< iostream >
using   namespace  std;

int  cmp( const   void   * a, const   void   * b);

int  mx;
string  sa,str,res;
string  data[ 1010 ];
map
< string , bool >  dic;
queue
< string >  q;

int  main()
{
    
int  i,j,k,len,ls,le,n;
    
string  c;
    
    cin
>> n >> sa;
    
for (i = 0 ;i < n; ++ i)
    {
        cin
>> str;
        dic[str]
= false ;
        data[i]
= str;
    }
    qsort(data,n,
sizeof ( string ),cmp);
//     for(i=0;i<n;++i)cout<<data[i]<<endl;
    q.push(sa);
    mx
= 0 ;
    
    
while ( ! q.empty())
    {
        c
= q.front();
        len
= c.length();
//         cout<<c<<endl;
         if (len > mx)
        {
            mx
= len;
            res
= c;
        }
        q.pop();
        len
++ ;
        
for (ls = 0 ;ls < &&  data[ls].length() < len; ++ ls);
        
for (le = ls;le < &&  data[ls].length() == len; ++ le);
        
for (i = ls;i < le; ++ i)
        {
            
if (dic[data[i]]) continue ;
            
for (j = 0 ,k = 0 ;j < len + 1 ; ++ j)
            {
                
if (data[i][j] == c[k]) ++ k;
            }
            
if (k == len)
            {
                q.push(data[i]);
                dic[data[i]]
= true ;
            }
        }
    }
    cout
<< res << endl;
    
    
return    0 ;
}

int  cmp( const   void   * a, const   void   * b)
{
    
return  ( * (( string * )a)).length() - ( * (( string * )b)).length();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值