杭电oj:1251 统计难题
刚开始学习字典树感觉挺不能理解的,多看看博客就懂得差不多了吧,如果你还是不理解,建议跟着程序走一遍数据,就可以理解了,Trie树是经典的数据结构,竞赛很实用。
此题是Trie的板子题,没啥卡的评测点,可以一遍AC;
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define Base 'a'
int Trie[1000010][26];
int num[1000010];
int ans = 1;
void Insert(string s)
{
int i, c = 0;
for(int i = 0; i<s.length(); i++)
{
int n = s[i] - Base;
if(Trie[c][n] == 0)
{
Trie[c][n] = ans++;
}
c = Trie[c][n];
num[c]++;
}
}
int Find(string s)
{
int c = 0;
for(int i = 0; i<s.length(); i++)
{
int n = s[i] - Base;
if(Trie[c][n] == 0)
return 0;
c = Trie[c][n];
}
return num[c];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
while(getline(cin, s))
{
if(s.length() == 0)
break;
Insert(s);
}
while(getline(cin, s))
{
cout<<Find(s)<<endl;
}
return 0;
}