天天看点

Morse Mismatches UVA - 508

字符串匹配

#include <iostream>
#include <map>
#include <string>

using namespace std;


map<char,string>mp1;
map<string,string>mp2;

int main()
{
    char s;
    string str;
    while(cin>>s&&s!='*')
    {
        cin>>str;
        mp1[s]=str;
    }
    while(cin>>str&&str!="*")
    {
        string st="";
        for(int i=0;i<str.size();i++)
        {
             st+=mp1[str[i]];
        }
        mp2[str]=st;
    }
    while(cin>>str&&str!="*")
    {
        int cont=0;
        map<string,string>::iterator it;
        string ans="";
        for(it=mp2.begin();it!=mp2.end();it++)
        {
            if(str==it->second)
            {
                if(cont==0)
                    ans=it->first;
                cont++;
            }
        }
        if(cont==1)
        {
            cout<<ans<<endl;
            continue;
        }
        else if(cont>1)
        {
            ans+='!';
            cout<<ans<<endl;
        }
        else
        {
            double max=1e90;
            string ans="";
            int fg2=0;
            for(it=mp2.begin();it!=mp2.end();it++)
            {
                int i;
                int fg=0;
                for(i=0;i<str.size();i++)
                {
                    if((it->second)[i]!=str[i])
                    {
                        break;
                    }
                    else
                    {
                        fg=1;
                    }
                }
                if(fg==1)
                {
                    if(i==str.size())
                    {
                        int num12=(it->second).size()-str.size();
                        if(num12<max)
                        {
                            fg2=1;
                            max=num12;
                            ans.clear();
                            ans=it->first;
                        }
                    }
                    else
                    {
                        if(i==(it->second).size())
                        {
                            int num12=str.size()-(it->second).size();
                            if(num12<max)
                            {
                                fg2=1;
                                max=num12;
                                ans.clear();
                                ans=it->first;
                            }
                        }
                    }
                }
            }
            if(!fg2)
            {
                it=mp2.begin();
                cout<<it->first<<endl;
            }
            else
            {
                ans+="?";
                cout<<ans<<endl;
            }
        }
    }
    return 0;
}