POJ 2001 Shortest Prefixes 解题报告 字典树

POJ 2001 Shortest Prefixes 解题报告

解题思路:建个字典树,每到一个点,这个点计数+1,查找时每个字符串从前往后查找,如果计数为1,说明唯一了,直接输出;如果已经到字符串末尾,也直接输出。
在这里插入图片描述

#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
const int maxn = 1e9;
using namespace std;
char a[1005][23];
struct trie {
	int cnt;//标记到达该点的次数
	trie* next[26];
};
trie* root;
void build(trie* t, char c[])
{
	int len = strlen(c);
	for (int i = 0; i < len; i++)
	{
		if (t->next[c[i] - 'a'] == NULL)
		{
			trie* tem = (trie*)malloc(sizeof(trie));
			tem->cnt = 1;
			for (int i = 0; i < 26; i++)
			{
				tem->next[i] = NULL;
			}
			t->next[c[i] - 'a'] = tem;
			t = t->next[c[i] - 'a'];
		}
		else
		{
			t = t->next[c[i] - 'a'];
			t->cnt++;
		}
	}
}
void query(trie* t, char c[])
{
	int len = strlen(c);
	char cc[25];
	memset(cc, 0, sizeof(cc));
	for (int i = 0; i < len; i++)
	{
		if(t->next[c[i] - 'a'] != NULL)
		{
			cc[i] = c[i];
			t = t->next[c[i] - 'a'];
			if (t->cnt == 1 || i == len - 1)
			{
				printf("%s %s\n", c, cc);
				return;
			}
		}
	}
}
int main()
{
	int n = 0;
	root = (trie*)malloc(sizeof(trie));
	root->cnt = 0;
	for (int i = 0; i < 26; i++)
	{
		root->next[i] = NULL;
	}
	while (scanf("%s", &a[n]) != EOF)
	{
		build(root, a[n]);
		n++;
	}
	for (int i = 0; i < n; i++)
	{
		query(root, a[i]);
	}
}



发布了64 篇原创文章 · 获赞 0 · 访问量 1451

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/104680196
今日推荐