UVA 10391 Compound Words
2012-10-20 16:28
447 查看
大意:判断一个字符串是否由给定的一些字符中两个组成。
思路:可以用hash,也可以用字典树+枚举,字典树似乎比较快。
CODE:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXN 120010
char save[120010][30];
struct Trie
{
Trie *next[26];
int value;
Trie()
{
for(int i = 0; i < 26; i++)
next[i] = 0;
value = 0;
}
};
void insert(Trie *&root, char *s)
{
int i = 0, branch = 0;
Trie *p = root;
if(!p)
{
p = new Trie();
root = p;
}
while(s[i])
{
branch = s[i]-'a';
if(!p->next[branch]) p->next[branch] = new Trie();
p = p->next[branch];
i++;
}
p->value = 1;
}
int find(Trie *root, char *s)
{
int i = 0, branch = 0;
Trie *p = root;
if(!p) return 0;
while(s[i])
{
branch = s[i]-'a';
if(!p->next[branch]) return 0;
p = p->next[branch];
i++;
}
if(p->value) return 1;
return 0;
}
int main()
{
int tot = 0;
Trie *root = NULL;
while(~scanf("%s", save[tot]))
{
insert(root, save[tot]);
tot++;
}
for(int i = 0; i < tot; i++)
{
int len = strlen(save[i]);
for(int j = 0; j < len; j++)
{
char temp1[110] = {'\0'};
char temp2[110] = {'\0'};
strncpy(temp1, save[i], j); //前半部分
strncpy(temp2, save[i]+j, len-j); //后半部分
if(find(root, temp1) && find(root, temp2))
{
printf("%s\n", save[i]);
break;
}
}
}
return 0;
}
思路:可以用hash,也可以用字典树+枚举,字典树似乎比较快。
CODE:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXN 120010
char save[120010][30];
struct Trie
{
Trie *next[26];
int value;
Trie()
{
for(int i = 0; i < 26; i++)
next[i] = 0;
value = 0;
}
};
void insert(Trie *&root, char *s)
{
int i = 0, branch = 0;
Trie *p = root;
if(!p)
{
p = new Trie();
root = p;
}
while(s[i])
{
branch = s[i]-'a';
if(!p->next[branch]) p->next[branch] = new Trie();
p = p->next[branch];
i++;
}
p->value = 1;
}
int find(Trie *root, char *s)
{
int i = 0, branch = 0;
Trie *p = root;
if(!p) return 0;
while(s[i])
{
branch = s[i]-'a';
if(!p->next[branch]) return 0;
p = p->next[branch];
i++;
}
if(p->value) return 1;
return 0;
}
int main()
{
int tot = 0;
Trie *root = NULL;
while(~scanf("%s", save[tot]))
{
insert(root, save[tot]);
tot++;
}
for(int i = 0; i < tot; i++)
{
int len = strlen(save[i]);
for(int j = 0; j < len; j++)
{
char temp1[110] = {'\0'};
char temp2[110] = {'\0'};
strncpy(temp1, save[i], j); //前半部分
strncpy(temp2, save[i]+j, len-j); //后半部分
if(find(root, temp1) && find(root, temp2))
{
printf("%s\n", save[i]);
break;
}
}
}
return 0;
}
相关文章推荐
- UVa 10391 - Compound Words 字符串hash
- UVA 10391 Compound Words
- UVa 10391 Compound Words
- UVa 10391 - Compound Words 字符串hash
- UVa 10391 & ZOJ 1825 - Compound Words
- uva 10391 Compound Words
- UVa 10391 - Compound Words
- UVA 10391 Compound Words -
- UVA - 10391 Compound Words(hash)
- UVA 10391 Compound Words
- UVA 10391 Compound Words
- UVA 10391 Compound Words
- uva 10391 Compound Words
- UVA ~ 10391 ~ Compound Words (set + 暴力)
- UVa:10391 Compound Words
- uva--10391 - Compound Words
- UVA - 10391 Compound Words
- UVA_10391: Compound Words
- UVa 10391 Compound Words
- uva 10391 Compound Words(stl map)