STL的应用

混杂游戏

问题描述:以前流行玩一种文字游戏—混杂。作为混杂就是在一个已知的答案中解读一串被打乱的字符串。你的任务是写一个程序,解读这个难题。

输入:
输入的一行是一个整数(1<=T<=100),表示有几组输入数据。
每组输入由4部分组成:
(1)一个字典,最多包含2000个单词,每个单词一行。
(2)一行字符串”XXXXXX”,作为字典部分的结束标志。
(3)1个或多个( 最多2000个 )需要解读的字符串。每个一行。
(4) 一行字符串”XXXXXX”,作为解读部分的结束标志。
以上的每个单词都只有小写字母组成,最长不超过10。字典不一定是有序的。单词是唯一的。

输出:
每组输出中,对应每个解读串A,如果有一个串B和A由相同的字母组成,则认为B可以解读A。在字典中找到所有可以解读A的串,并且以字典的顺序输出,每个单词一行,然后输出一行“*” 。如果没有找到符合条件的字符串,就输出一行“NO ONE“,然后输出一行 ”*“。

Sample Input
1
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX

Sample Output
score


refund


part
tarp
trap


NO ONE


course


Source
典型的字典树,yes?
here I tried to use a little easy method~
record every letter’s occurance in each word
and use stl in vector, use it to save string in dictionary

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
#define M 2005

int a[M][26], b[26];
vector<string> vecDic;

void main()
{
    int iInputNumber;
    scanf("%d", &iInputNumber);
    string sString;
    int flag;
    int i, j, index;
    while (iInputNumber--)
    {
        vecDic.clear();
        index = 0;
        // 输入每一组字典
        while (cin>>sString && sString!="XXXXXX")
        {
            vecDic.push_back(sString);
            index++;
        }
        sort(vecDic.begin(), vecDic.end());
        for (i=0; i<index; i++)
        {
            for (j=0; j<26; j++)
                a[i][j] = 0;
            for (j=0; j<vecDic[i].length(); j++)
                a[i][vecDic[i][j]-'a']++;
        }

        // 输入需要猜测的单词。
        while (cin>>sString && sString!="XXXXXX")
        {
            for (i=0; i<26; i++)
                b[i] = 0;
            for (i=0; i<sString.length(); i++)
                b[sString[i]-'a']++;
            // 用来表示字典中是否有该单词的。
            flag = 0;
            for (i=0; i<index; i++)
            {
                for (j=0; j<26; j++)
                {
                    if (a[i][j] != b[j])
                        break;
                }
                if (j==26)
                {
                    cout << vecDic[i] << endl;
                    flag = 1;
                }
            }
            if (!flag)
                cout << "NO ONE" << endl;
            cout << "******" << endl;
        }
    }
}

第二种方法:
把每个字典的单词拆散,按字母顺序排序,用map与其原来的单词对应。

#include <iostream>  
#include <algorithm>  
#include <string>  
#include <vector>  
#include<map>  
using namespace std;  

multimap<string,string>dic;  
multimap<string,string>::iterator it,it2;  


void main()  
{  
    int T;  
    scanf("%d",&T);  
    string str;  
    int flag;  
    while(T--)  
    {  
        int sub=1;  
        dic.clear();  
        while(cin>>str&&str!="XXXXXX")  
        {  
            string temp=str;  
            sort(str.begin(),str.end());  
            //dic[str]=temp;  
            dic.insert(pair<string,string>(str,temp));  
        }  
        string rec[2000];  
        while(cin>>str&&str!="XXXXXX")  
        {  
            sort(str.begin(),str.end());  

            flag=0;  
            it=dic.find(str);  
            if(it==dic.end())  
                cout<<"NO ONE"<<endl;  
            else  
            {  
                int index=0;  
                for(it2=it;it2!=dic.end();it2++)  
                {  
                    if((*it2).first!=str)  
                        break;  
                    else    rec[index++]=(*it2).second;  
                }  
                sort(rec,rec+index);  
                for(int i=0;i<index;i++)  
                    cout<<rec[i]<<endl;  
                //cout<<(*it2).second<<endl;  
            }  
            cout<<"******"<<endl;  
        }  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值