E - Morse Mismatches UVA - 508 (STL,模糊暴力)

題目鏈接:點擊打開鏈接

題意:給你26個字母以及0~9對應的摩斯密碼,再給你幾個字符串,輸入摩斯密碼,找到對應的字符串輸出; 
 
題解:
          1,使用 map 容器將輸入的東西連接起來。
          2,結果出現 ! 時,存在多組字符串與求出的摩斯密碼對應,輸出的應是字典排序中最小的那個再加上’ !‘ 。
          3,結果出現 ? 時,輸入的摩斯密碼與所給字符串轉化的摩斯密碼存在差別(只有摩斯密碼的長短不同),輸出的是與所給摩斯密碼長度最相近的那個字符串再加上‘ ? ’。
          4,結果只有一個字符串,不存在 ! 和 ? ,直接輸出(此時只有一組字符串與之對應)。



#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <map>
#include <vector>
#include <cmath>
using namespace std;


int main()
{

    map<char,string> Q;
    char c;
    while(cin>>c&&c!='*'){
        string s; cin>>s;
        Q[c]=s;
    }

    string str;
    map<string,string>P;
    while(cin>>str&&str!="*"){
        for(int i=0;i<str.length();i++){
            P[str]+=Q[str[i]];
        }
    }

    string s[10000]; int k=0;
    while(cin>>s[k]&&s[k]!="*"){
        k++;
    }

    for(int i=0;i<k;i++){
        string ss; int cnt=0;
        for(map<string,string>::iterator it=P.begin();it!=P.end();it++){
            if(s[i]==it->second){
                if(cnt==0)
                   ss=it->first;
                cnt++;
            }
        }
        if(cnt==1) cout<<ss<<endl;
        else if(cnt>1) cout<<ss<<"!"<<endl;
        else if(cnt==0){
            string sl;
            int minn=9999999;
            for(map<string,string>::iterator it=P.begin();it!=P.end();it++){
                if(s[i].substr(0,it->second.length())==it->second||it->second.substr(0,s[i].length())==s[i]){
                    if(labs(it->second.length()-s[i].length())<minn){
                        minn=labs(it->second.length()-s[i].length());
                        sl=it->first;
                    }
                }
            }
            cout<<sl<<"?"<<endl;
        }
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章