當前位置:
首頁 >
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;
}
? ? ? ? ?
? ? ??
? ? ??
? ?
? ?
? ? ?給定一個詞典,然后問里面那些是復合詞,復合詞就是當前這個單詞正好是有兩個單詞拼接而成。
思路:
? ? ? 用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复合词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA10125和集
- 下一篇: UVA10763交换学生