Shortest Prefixes(字典树求唯一前缀)

Shortest Prefixes 字典树

题目大意:

给出一些单词,找出每个单词的最短前缀,这个前缀不能和其他单词的前缀相同,即前缀唯一,否则就输出它本身。

思路:

字典树模板题,记录一下每个串出现的次数,如果是叶节点,即vis【i】==1,就为答案 。

Code:

#pragma GCC optimiza(2) 
#include <iostream>
#include <cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 100007;
int trie[maxn][27];   //trie[i][j]=k,下标为i,字母为j的节点的j的后边字母的下标 
int vis[maxn];
char s[1007][30];
int k=1;


void insert(char *w){
	int len=strlen(w);
	int p=0;
	for(int i=0;i<len;i++){
		int c=w[i]-'a';
		if(!trie[p][c]){
			trie[p][c]=k++;
		}
		p=trie[p][c];
		vis[p]++;
	}
}

string search(string s){
	string ans;
	int len=s.length();
	int p=0;
	for(int i=0;i<len;i++){
		if(vis[p]==1) return ans;
		int c=s[i]-'a';
//		if(!trie[p][c]) return 0;
		ans+=s[i];
		p=trie[p][c];
	}
//	return color[p]==1;
	return ans;
}


int main()
{
    int n=0;
	while(scanf("%s",s[++n])!=EOF){
		insert(s[n]);
	} 
	for(int i=1;i<=n;i++){
		cout<<s[i]<<" "<<search(s[i])<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43872264/article/details/107609309