hdu 1247 Hat’s Words(字典樹+分段判斷)

Hat’s Words

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2391    Accepted Submission(s): 873

Problem Description
A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
You are to find all the hat’s words in a dictionary.

 

Input
Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
Only one case.

 

Output
Your output should contain all the hat’s words, one per line, in alphabetical order.
Sample Input
a ahat hat hatword hziee word
Sample Output
ahat hatword
 
          題目大意:給出你很多單詞,求哪些單詞是由這裏其他單詞(2個)連接組成的,注意!2個相同的單詞連接也可以的!
       又是字典樹,不過要操作一下指針鏈表。方法是:將每一個單詞分成兩部分,分成兩部分有len-1種方法,對每次情況進行枚舉判斷,判斷是否組成已有的單詞。這題也可以用stl的映射來做的,那個代碼很短,也還好吧。
代碼:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
using namespace std;

char sh[50005][20];

struct node
{
    bool flag;
    node *next[26];
};

node *root, memory[5000005];
int cnt = 0;

node *create()
{
    node *p = &memory[cnt++];
    int i;
    for(i = 0; i < 26; i++)
    {
        p->next[i] = NULL;
    }
    p->flag = false;
    return p;
}

void insert(char *s)
{
    node *p = root;
    int i, k;
    for(i = 0; s[i]; i++)
    {
        k = s[i] - 'a';
        if(p->next[k] == NULL)
        {
            p->next[k] = create();
        }
        p = p->next[k];
    }
    p->flag = true;
}

bool search(char *s)
{
    int i, j, k;
    bool tar;
    for(i = 0; s[i]; i++)
    {
        node *p = root;
        for(j = 0; j < i; j++)
        {
            k = s[j] - 'a';
            p = p->next[k];
        }
        if(p->flag == 1)
        {
            node *q = root;
            tar = true;
            for(j = i; s[j]; j++)
            {
                k = s[j] - 'a';
                if(q->next[k] == NULL)
                {
                    tar = false;
                    break;
                }
                q = q->next[k];
            }
            if(q->flag == 1 && tar)
            {
                return true;
            }
        }
    }

    return false;
}

int main()
{
    int i, n;
    root = create();
    i = 0;
    while(scanf("%s", sh[i]) != EOF)
    {
        insert(sh[i]);
        i++;
    }
    n = i;
    for(i = 0; i < n; i++)
    {
        if(search(sh[i]))
        {
            printf("%s\n", sh[i]);
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章