Description
A prefix of a string is a substring starting at the beginning of the given string. The prefixes of "carbon" are: "c", "ca", "car", "carb", "carbo", and "carbon". Note that the empty string is not considered a prefix in this problem, but every non-empty string is considered to be a prefix of itself. In everyday language, we tend to abbreviate words by prefixes. For example, "carbohydrate" is commonly abbreviated by "carb". In this problem, given a set of words, you will find for each word the shortest prefix that uniquely identifies the word it represents.Input
The input contains at least two, but no more than 1000 lines. Each line contains one word consisting of 1 to 20 lower case letters.Output
The output contains the same number of lines as the input. Each line of the output contains the word from the corresponding line of the input, followed by one blank space, and the shortest prefix that uniquely (without ambiguity) identifies this word.Sample Input
carbohydrate cart carburetor caramel caribou carbonic cartilage carbon carriage carton car carbonate
Sample Output
carbohydrate carboh cart cart carburetor carbu caramel cara caribou cari carbonic carboni cartilage carti carbon carbon carriage carr carton carto car carcarbonate carbona
字典樹入門題!
題意:
輸出在字典中有相同的前綴+1個字符來唯一識別這個單詞,該單詞在字典中是前綴,則輸出它。
代碼:
/* 1、對每個結點開一個字母集大小的數組,對應的下標是兒子所表示的字母, 內容則是這個兒子對應在大數組上的位置,即標號; */ #include#include #include #include using namespace std; const int Max=30; const int maxn=11000; typedef struct node { int count;// 該節點前綴 出現的次數 struct node *next[Max];//該節點的後續節點 }node; char s[1020][25]; node a[maxn]; int cur=0; int n=0; node *root; //初始化一個節點。nCount計數為1, next都為null node *creat() { node *tmp=&a[cur++]; tmp->count=1; for(int i=0;i next[i]=NULL; return tmp; } void insert(char *str) { int temp,len; node *p; p=root; len=strlen(str); for(int i=0;i next[temp]!=NULL) { p=p->next[temp]; p->count++; } else { p->next[temp]=creat(); p=p->next[temp]; } } } void find(char *str) { int len,temp; node *p; p=root; len=strlen(str); for(int i=0;i next[temp]; if(p->count>1) printf("%c",str[i]); else { printf("%c",str[i]);//多輸出了一個 return; } } } int main() { root=creat();//根節點 while(~scanf("%s",s[n])) { insert(s[n]);//建樹 n++; } for(int i=0;i