8.复合词(UVA10391)

复合词(UVA10391)

题目简单分析

题目的详细内容可以在这个网站上看到,下面简单说明一下题目要求。
[题意]
本题主要任务是对于给出的一个词典,找出里面可有其他两个单词组合成的组合词, 如newborn可由new和born组合而成。
[输入输出]
Sample Input:

a
alien
born
less
lien
never
nevertheless
new
newborn
the
zebra

Sample Output:

alien
newborn

[分析]
很容易看出来,这个题有两类解法:一种是将所有单词两两进行拼接,然后将拼接的结果在词典里进行查找。另一种方法是对每个单词进行分割,将分割后的两个单词在词典里进行查找。

由于题目要求最大单词数为120000,所以肯定需要考虑耗时问题。假设采用拼接策略,则时间复杂度为O(n^2);而如果采用分割策略,则时间复杂度为O(n*m),其中m为单词的平均长度减1。

从上面分析可知,当单词的平均长度m<n时,分割策略更优。

此外,为了提高查找速度,这里采用了STL中的map来存储单词。

代码

下面是采用分割策略的AC代码,采用拼接策略的代码提交后超时这里就不给出了。
注:C++版本为C++11,VScode的工程在github。代码如有bug,敬请指出。

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

map<string, bool> map1;
string s[121000];
int main(){
    string str1, str2;
    int cnt=0;
    while(cin >> s[cnt]){
        map1[s[cnt]]=true;
        cnt++;
    }
    for(int i=0;i<cnt;++i)
        for(int j=0;j<s[i].size();++j){
            str1=s[i].substr(0, j+1);
            str2=s[i].substr(j+1);
            if(map1[str1] && map1[str2]){
                cout << s[i] << endl;
                break;
            }
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43374723/article/details/84189680