• UVA


    /*
      这题我开始时的思路是:合成单词,两两合成,看组合得到的合成词是否在字典中,但这样很明显会超时
      
      最后查完题解,发现正确的思路是分割,不过分隔的做法也不止一种,具体见下:
    */



    /*
      法一:
      参考博客:http://blog.csdn.net/czjxy881/article/details/8300237
      
    A.  
      注意先说下博客里的代码,有两个不太妥当的地方
      1. 定义map时,定义的名称是hash,导致编译时出现了二义性的错误,猜测应该是hash和STL里面的hash重名了,所以此处应改
      
      2. 还有一个问题,就是之前曾经提到过的,使用map[key]之前,务必先检查键值是否存在,否则,可能会导致错误
      
      再复制一次:
      如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null
      
      然而这个地方,我觉得不太妥当,但是oj居然没有报错,我觉得有些不可思议,可能value设定的默认值,恰好地使得后台数据通过了吧...不过,还是不要赌这个运气了,语法上的坑,还是不要踩为好
      
    B.
      这种方法的思路:
      思路就是,每个单词分成的两个单词,将所有的分法判断一下,分出的两部分是否都在词典里存在,如果都存在,说明这个单词本身是满足条件的复合词
      
      唉,感慨一下,我这么就想不到呢~明明STL这些,我也算是做了些题,也学了一段时间了...
      
    C. 
       收获:
       那个博主的substr()函数用的可真巧妙啊!
    */

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    const int maxn = 120000 + 100;
    string s[maxn];
    map<string, bool> is_in;
    
    int main()
    {
    	int cnt = 0;
    	while (cin >> s[cnt])
    	{
    		is_in[s[cnt]] = 1;
    		cnt++;
    	}
    	for (int i = 0; i < cnt; i++)
    	{
    		for (int j = 0; j < (int)s[i].size() - 1; j++)
    		{
    			string a = s[i].substr(0, j + 1);
    			string b = s[i].substr(j + 1);
    			if (is_in.find(a) == is_in.end() || is_in.find(b) == is_in.end()) continue;
    			cout << s[i] << endl;
    			break;
    		}
    		
    	}
    	return 0;
    }

    /*
      这题好像还可以用哈希表来做,但目前对哈希表还没有太明白,先放一下,晚点再去自学,学完来填坑
    */


  • 相关阅读:
    C语言 · 递归求二项式系数值
    C语言 · 错误票据
    C语言 · 色盲的民主
    C语言 · 分苹果
    C语言 · Quadratic Equation
    C语言 · 企业奖金发放
    C语言 · 最长单词
    C语言 · 高精度加法
    C语言 · 判断回文
    C语言 · 简单计算器
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789426.html
Copyright © 2020-2023  润新知