hdu--1671--字典树<出现mle怎么解决>
一直觉得 指针版的 字典树 各种好 直到这题 出现了MLE之后 才发现 还是有点烦的=-=
但其实 解决的方法也蛮简单的 只要写了个deleteTrie函数就好了
1 void deleteTrie( trie* root ) 2 { 3 if( root == NULL ) 4 return; 5 for( int i = 0 ; i<size ; i++ ) 6 { 7 if( root->next[i] !=NULL ) 8 { 9 deleteTrie( root->next[i] ); 10 } 11 } 12 delete root; 13 return; 14 }
这里 把我折磨了好久 当我写完这个的时候 没有再去 root = new trie一遍 导致一直 运行错误 找了好久 才发现 卧槽,。。
这题 就是给你N个字符串 问是否其中某个字符串是其他的前缀 或者它自身是别人的前缀
所以 就需要2个判断 分别判断自己是不是前缀 和 别人是否成为自己的前缀
这里用到的方法 和我上次用过的很像 设置一个flag变量 表明 这个字符串出现过了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 bool vis; 6 const int size = 10; 7 struct trie 8 { 9 struct trie* next[size]; 10 int flag; 11 }; 12 trie* root; 13 14 void init( trie* root ) 15 { 16 for( int i = 0 ; i<size ; i++ ) 17 { 18 root->next[i] = NULL; 19 } 20 root->flag = -1; 21 } 22 23 void create( char* str , int flag ) 24 { 25 trie*p = root; 26 trie* q; 27 int len = strlen(str); 28 for( int i = 0 ; i<len ; i++ ) 29 { 30 int id = str[i] - '0'; 31 if( p->next[id] == NULL ) 32 { 33 q = new trie; 34 init( q ); 35 p->next[id] = q; 36 } 37 else if( p->next[id]->flag != -1 ) 38 { 39 vis = true; 40 } 41 p = p->next[id]; 42 } 43 p->flag = flag; 44 for( int i = 0 ; i<size ; i++ ) 45 { 46 if( p->next[i]!=NULL ) 47 { 48 vis = true; 49 break; 50 } 51 } 52 } 53 54 void deleteTrie( trie* root ) 55 { 56 if( root == NULL ) 57 return; 58 for( int i = 0 ; i<size ; i++ ) 59 { 60 if( root->next[i] !=NULL ) 61 { 62 deleteTrie( root->next[i] ); 63 } 64 } 65 delete root; 66 return; 67 } 68 69 int main() 70 { 71 cin.sync_with_stdio(false); 72 char str[20]; 73 int t , n; 74 cin >> t; 75 while( t-- ) 76 { 77 root = new trie; 78 init( root ); 79 vis = false; 80 cin >> n; 81 while( n-- ) 82 { 83 cin >> str; 84 create( str , n ); 85 } 86 if( vis ) 87 cout << "NO" << endl; 88 else 89 cout << "YES" << endl; 90 deleteTrie(root); 91 } 92 return 0; 93 }
其实 还可以有种方法避免自己再deleteTrie后 忘记 root = new trie就是将 init函数的形参变下就好了
1 void init( trie*& root ) 2 { 3 root = new trie; 4 for( int i = 0 ; i<size ; i++ ) 5 { 6 root->next[i] = NULL; 7 } 8 root->flag = -1; 9 }
这个形参的传入 在链表的学习的时候 经常用到..
today:
所谓成功 就是按你自己喜欢的方式 过完一生
每天 只要快乐 就足够了
just follow your heart