杭电1113题解

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1113


题目大意:

给你一系列单词,然后给你一些乱序的字母串,让你在单词集合中找到所有与字母串相同字母的单词,并且按字典序输出


题目思路:

先将字典里词条读进来,按照字典序排序,然后设置与之对应的每个词条按照字母升序排序的序列
  在读入一个乱序字母串后,再按字母升序排列,与字典里对比,将升序相同的序列对应的单词输出。
  由于map自动对前一个变量升序,所以把词条放在前面,把升序排序串放在后面,构造查找表


收获:

1. string s;  sort (s.begin(),s.end());可以对s字符串进行升序排序
    若是用char s[100];则sort(s,s+strlen(s));进行升序排序


 2.map的用法   定义   map <string ,string > node;
                   填充记录   node.insert(pair<string,string>(t,s)); //里面的记录自动按主关键字进行升序排序
        遍历记录  1) 定义遍历量map<string,string>::iterator it;
               2) 遍历   for(it=node.begin ();it!=node.end();it++)
                            3)   it->second         it->first
                   查找         .find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 
                 删除   l_it=maplive.find();   maplive.erase(l_it)
                  基本函数
      map的基本操作函数:
      C++ Maps是一种关联式容器,包含“关键字/值”对
      begin()          返回指向map头部的迭代器
      clear()         删除所有元素
      count()          返回指定元素出现的次数
      empty()          如果map为空则返回true
      end()            返回指向map末尾的迭代器
      equal_range()    返回特殊条目的迭代器对
      erase()          删除一个元素
      find()           查找一个元素
      get_allocator()  返回map的配置器
      insert()         插入元素
      key_comp()       返回比较元素key的函数
      lower_bound()    返回键值>=给定元素的第一个位置
      max_size()       返回可以容纳的最大元素个数
      rbegin()         返回一个指向map尾部的逆向迭代器
      rend()           返回一个指向map头部的逆向迭代器
      size()           返回map中元素的个数
      swap()            交换两个map
      upper_bound()     返回键值>给定元素的第一个位置
      value_comp()      返回比较元素value的函数


代码:

借鉴网上的某位大神的

#include<iostream> 
#include<stdio.h> 
#include<map> 
#include<string> 
#include<algorithm> 
using namespace std; 
map <string ,string > node; 
int main() 
{ 
    string s; 
    while(cin>>s&&s!="XXXXXX") 
    { 
        string t=s; 
        sort (s.begin(),s.end());//巧妙 
        node.insert(pair<string,string>(t,s));   //map中的记录是自动按主关键字进行升序排序,所以不用再进行排序 
 } 
 while(cin>>s) 
 { 
  if(s=="XXXXXX") break; 
  int flag=1; 
  map<string,string>::iterator it; 
    sort(s.begin (),s.end ()); 
    for(it=node.begin ();it!=node.end();it++) 
    { 
     if(it->second==s) 
     { 
      flag=0;cout<<it->first<<endl; 
     } 
    } 
    if(flag) cout<<"NOT A VALID WORD"<<endl; 
    cout<<"******"<<endl; 
 } 
 return 0; 
}  

猜你喜欢

转载自blog.csdn.net/liangwgl/article/details/78965218