UVa508 - Morse Mismatches

<p style="color: rgb(54, 46, 43); font-family: Arial; font-size: 14px; line-height: 26px;">输入字母的莫尔斯编码、字典,之后输入编码过的单词,要求输出对应的单词。</p><p style="color: rgb(54, 46, 43); font-family: Arial; font-size: 14px; line-height: 26px;">使用map保存莫尔斯编码,读入字典后,将每个单词的编码保存在vector中并排序。然后对于每个输入莫尔斯编码串,与字典比对进行输出。</p><p style="color: rgb(54, 46, 43); font-family: Arial; font-size: 14px; line-height: 26px;">紫书书上第四章的题,学过STL之后做更加简单。</p>

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
using namespace std;
string s;
map<char,string>decode;
struct m_word{
    string s,s0;
    m_word(string s="",string s0=""):s(s),s0(s0){}
    bool operator < (const m_word &x) const {
        return s0.length()==x.s0.length()?s0<x.s0:s0.length()<x.s0.length();
    }
};
vector<m_word> dict;
string code(){
    string s0;
    for(int i=0;i<s.length();++i){
        s0+=decode[s[i]];
    }
    return s0;
}
int main()
{
    ios::sync_with_stdio(false);
    while(1){
        char c;
        cin>>c;
        if(c=='*') break;
        cin>>s;
        cin.get();
        decode[c]=s;

    }
    while(1){
        cin>>s;
        if(s=="*") break;
        dict.push_back(m_word(s,code()));
    }
    sort(dict.begin(),dict.end());
    while(1){
        cin>>s;
        if(s=="*") break;
        int t=0,cnt;
        while(1){
            cnt=0;
            for(int i=0;i<dict.size();++i){
                if(dict[i].s0==s.substr(0,s.size()-t)){
                    if(!cnt) cout<<dict[i].s;
                    cnt++;
                }
                else if(dict[i].s0.substr(0,dict[i].s0.size()-t)==s){
                    if(!cnt) cout<<dict[i].s;
                    cnt++;
                }

            }
            if(cnt) break;
            ++t;
        }
        if(t) cout<<"?";
        else if(cnt!=1&&!t)cout<<"!";
        cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值