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 의 맵 으로 도 풀 수 있 습 니 다.그 코드 는 짧 고 괜 찮 습 니 다.
링크:http://acm.hdu.edu.cn/showproblem.php?pid=1247
코드:
#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
", sh[i]); } } return 0; }

좋은 웹페이지 즐겨찾기