poj 2001

貌似是最简单的trie树。。有点会了~

//============================================================================
// Name        : 2001.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char in[10000][50], out[10000][50];
int n;

typedef struct node{
	int num;
	node * next[30];
	node(){
		num = 1;
		for(int i = 0;i < 30;i++){
			next[i] = NULL;
		}
	}
}node;

node *root;

void insert(char *str){
	int len = strlen(str);
	node *now = root;
	int t;
	if(now == NULL){
		now = new node();
		now->num = 0;
		root = now;
	}
	for(int i = 0;i < len;i++){
		t = str[i]-'a';
		if(now->next[t] == NULL){
			now->next[t] = new node();
		}
		else{
			now->next[t]->num++;
		}
		now = now->next[t];
	}
}


void query(char *str, int m){
	node *now = root;
	int len = strlen(str);
	int t;
	for(int i = 0;i < len;i++){
		t = str[i]-'a';
		now = now->next[t];
		out[m][i] = str[i];
		if(now->num == 1){
			out[m][++i] = '\0';
			return ;
		}
	}
}



int main(){
	freopen("a.txt", "r", stdin);
	n = 0;
	while(scanf("%s", in[n])!=EOF){
		insert(in[n]);
		n++;
	}
	for(int i = 0;i < n;i++){
		query(in[i], i);
		printf("%s %s\n", in[i], out[i]);
	}
	return 0;
}

  

posted @ 2011-08-04 10:10  KOKO's  阅读(151)  评论(0编辑  收藏  举报