题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
NO YES
题意:
统计是否有相同的前缀!
代码如下:
#include <cstdio> #include <cstring> #include <malloc.h> #include <iostream> using namespace std; #define MAXN 10 typedef struct Trie { int v;//根据需要变化 Trie *next[MAXN]; //next是表示每层有多少种类的数,如果只是小写字母,则26即可, //若改为大小写字母,则是52,若再加上数字,则是62了 }Trie; Trie* root; void createTrie(char *str) { int len = strlen(str); Trie *p = root, *q; for(int i = 0; i < len; i++) { int id = str[i]-'0'; if(p->next[id] == NULL) { q = (Trie *)malloc(sizeof(Trie)); q->v = 1;//初始v==1 for(int j = 0; j < MAXN; j++) q->next[j] = NULL; p->next[id] = q; p = p->next[id]; } else { p->next[id]->v++; p = p->next[id]; } } p->v = -1;//若为结尾,则将v改成-1表示 } int findTrie(char *str) { int len = strlen(str); Trie *p = root; for(int i = 0; i < len; i++) { int id = str[i]-'0'; p = p->next[id]; if(p == NULL) //若为空集,表示不存以此为前缀的串 return 0; if(p->v == -1) //字符集中已有串是此串的前缀 return -1; } //return p->v; return -1; //此串是字符集中某串的前缀 } int dealTrie(Trie* T) { //动态字典树,有时会超内存,这是就要记得释放空间了 if(T==NULL) return 0; for(int i = 0; i < MAXN; i++) { if(T->next[i]!=NULL) dealTrie(T->next[i]); } free(T); return 0; } int main() { int t, n; char str[15]; scanf("%d",&t); while(t--) { int flag = 0; root = (Trie *)malloc(sizeof(Trie)); for(int i = 0; i < MAXN; i++) root->next[i] = NULL; scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%s",str); if(findTrie(str) == -1) { flag = 1; continue; } createTrie(str); } if(flag) printf("NO\n"); else printf("YES\n"); dealTrie(root); } return 0; }
原文:http://blog.csdn.net/u012860063/article/details/39007631