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

  

转载于:https://www.cnblogs.com/ACKOKO/articles/2126981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值