UVA10391复合词

来源:互联网 发布:m1216nfh扫描软件 编辑:程序博客网 时间:2024/05/17 02:26
题意:
     给定一个词典,然后问里面那些是复合词,复合词就是当前这个单词正好是有两个单词拼接而成。


思路:
      用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;
}
         
      
      
   
   





0 0
原创粉丝点击