题意:
     给定一个词典,然后问里面那些是复合词,复合词就是当前这个单词正好是有两个单词拼接而成。

思路:
      用map来标记是否出现过,然后先按长短排序,把每个单体拆分成任意两个可能的单词(每次拆分的时间可以是O(1)的),然后在看看这两个单词是否在之前出现过,如果都出现过就直接把当前单词放到答案数组里,然后记得break不然有可能当前单词可能有多重组合而成,失误把当前单词多记录了几次,最后在按照字典序sort答案数组就行了,题目没有给单词长度,我们设为ll,那么时间复杂度是:O(n*ll*log(n))目测ll不是很大。

#include<map>
#include<string>
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

typedef struct
{
   char str[105];
}S;

S ss[120005] ,Ans[120005];
map<string ,int>mark;

bool camp(S a ,S b)
{
   return strlen(a.str) < strlen(b.str);
}

bool camp2(S a ,S b)
{
   return strcmp(a.str ,b.str) < 0;
}

int main ()
{
   int i ,l;
   mark.clear();
   int nowid = 0;
   while(~scanf("%s" ,ss[++nowid].str));
   sort(ss + 1 ,ss + nowid + 1 ,camp);
   int ansid = 0;
   for(int ii = 1 ;ii <= nowid ;ii ++)
   {                 
      mark[ss[ii].str] = 1;
      l = strlen(ss[ii].str);
      if(l == 1) continue;
      for(i = 1 ;i <= l - 1 ;i ++)
      {
         int s = 0;
         char tmp = ss[ii].str[i];
         ss[ii].str[i] = '\0';
         if(mark[ss[ii].str]) s ++;
         ss[ii].str[i] = tmp;
         if(s&&mark[ss[ii].str+i])
         {
            Ans[++ansid] = ss[ii];
            break;
         } 
      }  
    }
    sort(Ans + 1 ,Ans + ansid + 1 ,camp2);
    for(i = 1 ;i <= ansid ;i ++)
    puts(Ans[i].str);
   return 0;
}

UVA10391复合词相关推荐

  1. UVa10391 复合词

    给出一个词典,找出所有的复合词,即恰好有两个单词连接而成的单词.输入每行都是一个由小写字母组成的单词.输入已按照字典序从小到大排序,且不超过120000个单词.输出所有复合词,按照字典序从小到大排列. ...

  2. ACM Uva10391复合词

    题意如下 输入一系列由小写字母组成的单词.输入已按照字典序排序且不超过120000个.找出所有的复合词,即恰好由两个单词连接而成的单词. 下面展示C++程序 #include<set> # ...

  3. 算法竞赛入门经典 第二版 习题5-5 复合词 Compound Words uva10391

    题目:https://vjudge.net/problem/UVA-10391 思路:用vector存下单词,因为单词已按字典序排列于是复合词前半个单词一定在这个复合词之前,于是遍历寻找在首字母更变之 ...

  4. 算法竞赛入门经典(第2版)习题5-5 复合词 UVa10391

    用拆分词的思路很棒 #include <iostream> #include <cstdio> #include <cstdlib> #include <st ...

  5. 习题5-5 复合词 UVa10391

    1.题目描述:点击打开链接 2.解题思路:原来试了若干种思路,都失败了:1.枚举两个单词获得TLE(写了好几遍都是TLE==),2,从一个单词中拆分出一个已有单词查找剩余部分是否存在获得WA,最后决定 ...

  6. Uva10191 复合词

    题目描述: 给出一个按字母序排列的单词列表,找到其中存在的复合词.复合词的定义是由单词列表中其他的两个单词拼接而成.所有单词均为小写. 思路: 如果直接两层遍历所有的单词组合,看他们加在一起是否是单词 ...

  7. 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告

    励志用少的代码做高效的表达 题目(提交)链接→UVA-10391 本题实质是#include<string>头文件的substr()字符串分割函数与#include<algorith ...

  8. mysql重叠的词_举例说明叠音词,重叠式复合词,词的重叠,三者有何不同?

    叠音和重叠是重叠构词的两种方式. 叠音词是单纯词,由相同的不成语素的音节重叠而成,分为两种情况: 1.单个音节有音无义, 如:皑皑.猩猩 2.单个音节有音有义,但与重叠后构成的词的意义完全不同,也没有 ...

  9. 计算机英语是不是复合词,计算机英语专业词汇的构成.ppt

    计算机英语专业词汇的构成 * 计算机英语专业词汇的构成 专业词汇的构成 派生词 (derivation) 复合词 (compounding) 混成词 (blending) 前缀 缩略词 (shorte ...

最新文章

  1. AI 版 Nature Index 排名,两种结果折射中国 AI 实力软肋
  2. WWDC2014:留给微软的时间不多了!
  3. 用c语言批量删除指定文件夹,C语言删除文件夹下所有代码的注释for Mac
  4. ajax id sort,ajax返回的json内容进行排序使用sort()方法实现
  5. VS code常用插件推荐(总结整理篇)
  6. BAT的前端,不是技术牛就够了!还应该锻炼这些能力
  7. Java -- IO
  8. Linux之find exec
  9. matlab size
  10. MPPT “最大功率点跟踪”
  11. openGL之API学习(一四七)实时渲染、光线追踪渲染和栅格化渲染
  12. 安防综合管理平台/视频资源汇聚平台
  13. SOLIDWORKS教程:solidworks常用技巧大全
  14. java word 分段符,Word2013文档中插入分隔符(分节符)的方法
  15. 大数据小项目之电视收视率企业项目05
  16. 数据可视化之美—BI
  17. SVN 报错:does not support the HTTP/DAV protocol
  18. Redux和react-redux的区别是什么?
  19. 计算机二级 ms office高级应用,全国计算机等级考试二级教程:MS Office高级应用...
  20. setTimeout()的用法

热门文章

  1. MVC基于角色权限控制--用户管理
  2. iOS11和机器学习CoreML库
  3. JS无法获取display为none的隐藏元素的宽度和高度的解决方案
  4. (五十九)自动存储、静态存储、动态存储
  5. 编写更好的CSS代码
  6. JS日历控件集合----附效果图、源代码
  7. 模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承
  8. python中zip( )的使用
  9. 转:马云语录之公司请你来干嘛
  10. css之其它技巧和经验列表