zoj 2346 || poj 2001 Shortest Prefixes(Trie~!)

先看到poj的这个题了。昨晚看到的,昨晚睡觉想到一种方法,今天上午上自习了,中午回来敲了敲。。

 

WA = =。

 

 

 

想的是,如果不止有一个子指针为空,就继续找,直到,只有一个指针为空即可。

样例都过不去 = =。理解了

比如cab   cabd   cabde

那个cab三个字母都是只有一个指针为空的,可是,它是这三个的共有前缀,肯定不符合。

好吧。又想一种做法。就是,遇到某个字母,结构体里面存的数++,这样的话,只有一个字母经过这儿的话,肯定是这个单词特有的(因为没有其他单词可以经过这个字母),记录下下标即可。如果没有找到,肯定是整个单词是别人的前缀的情况,那么把这个单词输出即可。

zoj的就格式不是太一样,PE1次 = =。我的代码是zoj格式。

 

 

 

用了静态和动态。

 

居然动态比静态快耶。。。= =。。。纠结。我觉得,静态感觉纠结就是不知道到底要开多大。。。= =。。

 

动态

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; typedef struct Trie{ Trie *child[26]; int num; }Trie; Trie *p; int tempind; char str[1010][50]; void init() { p = (Trie*)malloc(sizeof(Trie)); for(int i=0; i<26; i++) p -> child[i] = NULL; p -> num = 0; } void Build( char *a ) { Trie *head = p; int len = strlen(a); for(int i=0; i<len; i++) { int ind = a[i] - 'a'; if( head -> child[ind] == NULL ) { head -> child[ind] = (Trie*)malloc( sizeof(Trie) ); for(int k=0; k<26; k++) head -> child[ind] -> child[k] = NULL; head -> child[ind] -> num = 0; } head = head->child[ind]; head->num++; } } void Find( char *a ) { Trie *head = p; int len = strlen(a); for(int i=0; i<len; i++) { int ind = a[i] - 'a'; if( head->child[ind]->num == 1 ) { tempind = i; return; } head = head -> child[ind]; } tempind = len-1; } int main(void) { int i,ncases; scanf("%d",&ncases); getchar();getchar(); while( ncases--) { i = 0; init(); while( gets(str[i]) && strlen(str[i]) ) { Build(str[i]); i++; } for(int k=0; k<i; k++) { tempind = -1; Find(str[k]); printf("%s ",str[k]); for(int j=0; j<=tempind; j++) printf("%c",str[k][j]); printf("/n"); } if( ncases ) printf("/n"); } return 0; }  

 

静态

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; typedef struct Trie{ Trie *child[26]; int num; }Trie; Trie node[100000]; int cou,tempind; char str[1010][50]; void init() { memset(node,'/0',sizeof(node)); cou = 1; } void Build( char *a ) { Trie *head = &node[0]; int len = strlen(a); for(int i=0; i<len; i++) { int ind = a[i] - 'a'; if( head -> child[ind] == NULL ) head -> child[ind] = &node[cou++]; head = head->child[ind]; head->num++; } } void Find( char *a ) { Trie *head = &node[0]; int len = strlen(a); for(int i=0; i<len; i++) { int ind = a[i] - 'a'; if( head->child[ind]->num == 1 ) { tempind = i; return; } head = head -> child[ind]; } tempind = len-1; } int main(void) { int i = 0; int ncases; scanf("%d",&ncases); getchar(); getchar(); while( ncases-- ) { i = 0; init(); while( gets(str[i]) && strlen(str[i]) ) { Build(str[i]); i++; } for(int k=0; k<i; k++) { tempind = -1; Find(str[k]); printf("%s ",str[k]); for(int j=0; j<=tempind; j++) printf("%c",str[k][j]); printf("/n"); } if( ncases ) printf("/n"); } return 0; }  

你可能感兴趣的:(c,struct,null,Build)