题型:数据结构
题意:给出若干个字符串,找出每个字符串的最短前缀,不能与其他字符串的前缀相同。
分析:
简单的方法是直接快排,我们这里用字典树来做。
建立字典数的时候,可以对每个节点记录一个num,添加一个字符,num就加1。
然后就是搜索了,有两种情况:
1、字符串本身就是其他串的子串
2、最长公共前缀加上下一个字符
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#define MAXN 30
using namespace std;
struct Node{
int num;
Node *next[26];
Node(){
num = 0;
for(int i=0;i<26;i++){
next[i] = NULL;
}
}
};
char str[1234][25];
void insert(Node *root,char *s){
Node *p;
p = root;
for(int i=0;s[i];i++){
int x = s[i] - 'a';
if(p->next[x] == NULL)
p->next[x] = new Node;
p = p->next[x];
p->num ++;
}
}
void search(Node *root,char *s){
int len = strlen(s);
Node *p;
p = root;
for(int i=0;i<len;i++){
int x = s[i] - 'a';
printf("%c",s[i]);
if(p->next[x] != NULL && p->next[x]->num == 1) return;
p = p->next[x];
}
}
int main(){
Node *root = new Node;
int cnt = 0;
while(~scanf("%s",str[cnt])){
insert(root,str[cnt]);
cnt++;
}
for(int i=0;i<cnt;i++){
printf("%s ",str[i]);
search(root,str[i]);
puts("");
}
return 0;
}