POJ 2001最短プレフィックス解決のレポートトライ

POJ 2001最短プレフィックス解決レポート

ソリューションの概要:トライを構築し、ポイントにそれぞれ、ポイント数+、カウントがユニークな、ダイレクト出力を示し、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