2014年12月14日星期日

[UVa] 123 - Searching Quickly

這次算是STL的實習

運用了一些功能強大的函式

在此作個簡介

set : 集合,不會包含相同元素的集合

map : 可作一對一映射,兩者的資料型態可以不同

multimap : 可作一對多的映射

本題的作法,因為multimap在建立之時,就已經以前者元素作排序

getline讀入的一行也因為先後順序不同,在插入map時也排序好了

所以在map建立後直接輸出即可

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
#include <set>
#include <map>
using namespace std;
int main(){
  freopen("input.txt", "r", stdin);
  set<string> igwords;
  set<string>::iterator it; 
  string input;
  while(1){ //insert ignore words into igwords set
    cin >> input;
    if(input=="::")break;
    else {
      igwords.insert(input);
      input.erase();
    }
  }
  string title;
  multimap<string,string> titles;
  map<string,string>::iterator it_map =titles.begin();
  while(getline(cin,input)){ //getline(input_stream,destination_string)
    title.erase();
    for(int i=0;i<=input.size();i++)input[i] = tolower(input[i]); 
    for(int i=0;i<=input.size();i++){
      if(!isalpha(input[i])){
        if(igwords.count(title)==0 && isalpha(title[0])){ //如果和igwords都不相符
          string input_tmp = input; //開始將input中的單字轉為大寫存入input_tmp
          int tmp = i - title.length(); //
          for(int k = tmp; k < tmp+title.length(); k++) input_tmp[k]=toupper(input[k]); 
          titles.insert(it_map,pair<string,string>(title,input_tmp)); //存入titles中
        }
        title.erase();
        continue;
      }
      title+=input[i];
    }
    input.erase();
  }
  //print set
//  for(it=igwords.begin();it!=igwords.end();it++)cout << *it << '\n';
//  cout << "\n";
  for(it_map=titles.begin();it_map!=titles.end();it_map++)cout << it_map->second << '\n';
  return 0;

}

沒有留言: