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]);
}
}