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;
}
给定一个词典,然后问里面那些是复合词,复合词就是当前这个单词正好是有两个单词拼接而成。
思路:
用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
- UVA10391复合词
- UVa10391 复合词
- UVA10391-复合词
- UVA10391:Compound Words(复合词)
- 习题5-5 复合词 UVa10391
- 算法竞赛入门经典 习题5-5 复合词 UVa10391
- 复合词
- 算法竞赛入门经典 第二版 习题5-5 复合词 Compound Words uva10391
- 算法竞赛入门经典(第2版)习题5-5 复合词 UVa10391
- UVA10391
- UVa10391
- UVA10391
- uva10391
- UVa10391
- uva10391
- uva10391
- uva10391
- UVa10391
- Spring开发环境的配置
- UVA10125和集
- Winform开发框架之读卡器和条码扫描枪的数据接收处理
- asp.net中自定义类的应用
- Android P2P语音通话实现(思路探讨)
- UVA10391复合词
- 今天把框架升级了一下,整体升级
- 《高性能的RTC服务器OpenFire》—第一章部署与源码调试
- 10 Code Coverage Tools for C & C++
- setCapture和releaseCapture的小应用
- RK3188从SDCARD中运行Android系统
- UVA10763交换学生
- 脚本练习_计算运行中的进程所占内存总和
- 第十三周项目一:数组大折腾(3)