小记:1A
思路:插入时对每个遇到的字符增加个标记,出现一次就增加1,那么最后只有出现一次的就是最短前缀
查找时,碰到1的就将该串字符头至标记为1的字符输出即可
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 1010;
const int MAX = 26;
const int N = 500010;
const int INF = (1<<30);
typedef struct Node{
int isStr;
int num;
struct Node *next[MAX];
Node():isStr(-1),num(0){
memset(next, NULL, sizeof(next));
}
~Node(){
for(int i = 0;i < MAX; ++i)
if(next[i] != NULL)
delete next[i];
}
}TrieNode,*Trie;
Trie root , root1;
char s[MAX], ss[MAX_][MAX];
int n, m;
void Insert(char *s){
TrieNode *p;
p = root;
while(*s){
if(p ->next[*s-'a'] == NULL){
p ->next[*s-'a'] = new TrieNode;
}
p = p ->next[*s-'a'];
p->num ++;
s++;
}
p->isStr = 1;
}
void find(char *s){
int i = 0;
TrieNode *p;
p=root;
//printf("%s ", s);
while(*(s+i)){
if(p->next[*(s+i)-'a'] == NULL)return ;
p = p->next[*(s+i)-'a'];
++i;
if(p->num == 1){
break;
}
}
for(int j = 0; j < i; ++j){
printf("%c",s[j]);
}
putchar('\n');
}
int main() {
//freopen("f:\\in.txt", "r", stdin);
int ans, cnt1, cnt2, len, T, k, inj, st, et, cnt;
bool flag;
flag = true;
root = new TrieNode;cnt = 0;
//ans = 0;flag = false;cnt = 0;
while(scanf("%s", s) != EOF){
strcpy(ss[cnt++], s);
Insert(s);
}
for(int i = 0; i < cnt; ++i){
printf("%s ",ss[i]);
find(ss[i]);
}
delete root;
}