UVA 10391 Compound Words

 

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

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

 

 

你可能感兴趣的:(word)