日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

UVA10391复合词

發布時間:2025/6/17 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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] = '\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复合词的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。