大意:判断一个字符串是否由给定的一些字符中两个组成。

思路:可以用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;
}

 

 

posted on 2012-10-20 16:28  有间博客  阅读(220)  评论(0)    收藏  举报