hdu 1251 统计难题 解题报告 字典树
解题思路:考字典树的创建和查询前缀。
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<string.h>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
const int maxn = 1e9;
using namespace std;
struct trie {
int cnt;
trie* next[26];
};
int cnt = 0;
void creat(trie* t, char str[])
{
int len = strlen(str);
for (int i = 0; i < len; i++)
{
if (t->next[str[i] - 'a'] == NULL)
{
trie* temp = (trie*)malloc(sizeof(trie));
for (int j = 0; j < 26; j++)
{
temp->next[j]=NULL;
}
temp->cnt = 0;
t->next[str[i] - 'a'] = temp;
}
t = t->next[str[i] - 'a'];
++t->cnt;//累计到该节点的次数
}
}
void query(trie* t, char str[])
{
int len = strlen(str);
int i;
for (i = 0; i < len; i++)
{
if (t->next[str[i] - 'a'] == NULL)
break;
t = t->next[str[i] - 'a'];
}
if (i == len)
{
cnt = t->cnt;
}
}
int main()
{
bool flag = false;
char str[20];
trie* t = (trie*)malloc(sizeof(trie));
for (int i = 0; i < 26; i++)
{
t->next[i] = NULL;
t->cnt = 0;
}
while (gets_s(str))
{
if (strlen(str) == 0)
{
flag = true;//切换至查询模式
continue;
}
if (!flag)
{
creat(t, str);
}
else
{
cnt = 0;
query(t, str);
printf("%d\n", cnt);
}
}
}