• UVA10391复合词


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


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





  • 相关阅读:
    CF110A Nearly Lucky Number
    Max Sum Plus Plus HDU – 1024
    洛谷 p1003 铺地毯
    poj-1226
    Where is the Marble? UVA – 10474
    Read N Characters Given Read4
    Guess Number Higher or Lower && 九章二分法模板
    Intersection of Two Arrays II
    Reverse Vowels of a String
    Meeting Rooms
  • 原文地址:https://www.cnblogs.com/csnd/p/12062621.html
Copyright © 2020-2023  润新知