hdu 1251 统计难题 解题报告 字典树

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);
		}
	}
}


发布了64 篇原创文章 · 获赞 0 · 访问量 1469

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/104274802
今日推荐