这就是一个很经典的字典树嘛
让我苦恼的就是那个输入了,怎么遇到一个空行就结束呐?
我想到的是getline函数,如果是空行的话,那么那个字符串第一个字符就是 '\0’
这样输入很简单了。
题目不难呐,但是不知道为啥我老是错。
最后错因…嘛,因为测试的输入输出没有删掉所以wa了…
哭料、、、、犯得傻事多的数不过来,正因如此所以长记性了,所以还是不够认真,以后这样的低级错误,只要肯反刍,细细品味。我不信这样的垃圾错误以后还犯!!!!????
哎…
其次我字典树模板写的挺好的,我觉得…
对啦还有,选G++交爆内存,选C++就不会发生这种事情!原因我也不知道为什么…
我发现大一的博客写的都充满了委屈,和犯了错后的心酸和痛苦。
遍地都是不细心的坑,也算是身经百战喽
下面是代码!
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
struct Trie{ //树的声明
int cnt;
Trie *edge[27];
Trie(){
memset(edge,0,sizeof(edge));
cnt = 0;
}
}*root = new Trie();
void insert(string s){ //利用输入的字符串建树喽
Trie *now = root;
for(int i = 0; s[i]; ++i){
int to = s[i]-'a';
if(now->edge[to] == NULL)
now->edge[to] = new Trie();
now = now->edge[to];
now->cnt++;
}
}
int find_trie(string s){ //查找前缀个数
Trie *now = root;
for(int i = 0; s[i]; ++i){
int to = s[i]-'a';
if(now->edge[to] == NULL)
return 0;
now = now->edge[to];
}
return now->cnt;
}
void delete_trie(Trie *root){ //释放内存
for(int i = 0; i < 26; ++i)
if(root->edge[i] != NULL)
delete_trie(root->edge[i]);
delete root;
}
int main(){
string s;
while(getline(cin,s)&&s[0] != '\0') //输入
insert(s);
while(cin >> s) //输出
cout << find_trie(s) << endl;
delete_trie(root);
return 0;
}