【trie树】查找由其他两个字符串组成的串 HDU1247

Hat’s Words

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

 

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

 

#include <bits/stdc++.h>
using namespace std;
const int mn = 50010, mm = 85;

char ch[mn][mm];
bool ed[mn * mm];
int trie[mn * mm][30];

int num;
void add(char ch[])
{
	int len = strlen(ch);
	int r = 0;
	for (int i = 0; i < len; i++)
	{
		int t = ch[i] - 'a';
		if (trie[r][t] == 0)
			trie[r][t] = ++num;
		r = trie[r][t];
	}
	ed[r] = 1;
}
bool ask(char ch[])
{
	int r = 0;
	int len = strlen(ch);
	for (int i = 0; i < len; i++)
	{
		int t = ch[i] - 'a';
		if (trie[r][t] == 0)
			return 0;
		r = trie[r][t];
	}
	if (ed[r] == 1)
		return 1;
	else
		return 0;
}

int main()
{
	int cas = 1;
	while (~scanf("%s", ch[cas]))
	{
		add(ch[cas]);
		cas++;
	}

	char s1[mm], s2[mm];
	for (int i = 1; i < cas; i++)
	{
		int len = strlen(ch[i]);
		for (int j = 1; j < len - 1; j++) // 枚举断点
		{
			strncpy(s1, ch[i], j);
			s1[j] = '\0';
			if (ask(s1) == 0)
				continue;

			strncpy(s2, ch[i] + j, len - j);
			s2[len - j] = '\0';
			if (ask(s2) == 1)
			{
				printf("%s\n", ch[i]);
				break;
			}
		}
	} // O(n * m * m)
	return 0;
}

 

    原文作者:Trie树
    原文地址: https://blog.csdn.net/ummmmm/article/details/82731068
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞