【Trie】 UVA1401 Remember the Word

代码

cpp 复制代码
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <functional>
#include <math.h>
#include <string>
#include <iostream>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define _for(i, a, b) for (int i = (a); i < (b); i++)
#define _rep(i, a, b) for (int i = (a); i <= (b); i++)
#define fio ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define reg register
#define ri reg int

namespace faio
{
	char buf[1 << 20], *p1, *p2;
	#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF: *p1++)
	template <typename T> inline void read(T &t) {
		ri v = getchar();T f = 1;t = 0;
		while (!isdigit(v)) {if (v == '-')f = -1;v = getchar();}
		while (isdigit(v)) {t = (t << 3) + (t << 1) + v - '0';v = getchar();}
		t *= f;
	}
	template <typename T,typename... Args> inline void read(T &t, Args&... args) {read(t);read(args...);}
}

constexpr int N = 300010, mod = 20071027;
char str[N], word[128];
int dp[N];

typedef struct Trie_t
{
	bool is_end;
	Trie_t* son[26];
}*Trie;

Trie NewNode() {
	Trie ret = (Trie) malloc(sizeof(Trie_t));
	for (int i = 0; i < 26; i++) ret->son[i] = NULL;
	ret->is_end = false;
	return ret;
}
void FreeNode(Trie p) { // 释放 Trie 树
	if (p == NULL) return ;
	for (int i = 0; i < 26; i++) FreeNode(p->son[i]);
	free(p);
}
void insert(Trie root, const char* _str)
{
	Trie u = root; int len = strlen(_str);
	for (int i = 0; i < len; i++) {
		int idx = _str[i] - 'a';
		if (u == NULL) printf("u is NULL");
		if (u->son[idx] == NULL) u->son[idx] = NewNode();
		u = u->son[idx];
	}
	u->is_end = true;
}
void solve(Trie root)
{
	static int Kase = 0;
	int n = strlen(str); dp[n] = 1;
	for (int i = n - 1; i >= 0; i--) {
		// 在 Trie 树里面找
		Trie u = root;
		for (int j = i; j < n; j++) {
			int idx = str[j] - 'a';
			if (u->son[idx] == NULL) break;
			u = u->son[idx];
			if (u->is_end) dp[i] = (dp[i] + dp[j + 1] + mod) % mod;
		}		
	}
	printf("Case %d: %d\n", ++Kase, dp[0]);
}

int main()
{	
	while (scanf("%s", str) == 1) {
		int p; scanf("%d", &p);
		Trie root = NewNode();
		memset(dp, 0, sizeof(dp));
		
		while (p--) {
			scanf("%s", word);
			insert(root, word);
		}
		solve(root);
		FreeNode(root);
	}
	return 0;
}
相关推荐
坚持编程的菜鸟1 天前
LeetCode每日一题——困于环中的机器人
c语言·算法·leetcode·机器人
Aurorar0rua1 天前
C Primer Plus Notes 09
java·c语言·算法
我不是QI1 天前
DES 加密算法:核心组件、加解密流程与安全特性
经验分享·算法·安全·网络安全·密码学
前端小刘哥1 天前
新版视频直播点播EasyDSS平台,让跨团队沟通高效又顺畅
算法
明月(Alioo)1 天前
机器学习入门,无监督学习之K-Means聚类算法完全指南:面向Java开发者的Python实现详解
python·算法·机器学习
叶梅树1 天前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
lingran__1 天前
算法沉淀第三天(统计二进制中1的个数 两个整数二进制位不同个数)
c++·算法
MicroTech20251 天前
微算法科技MLGO推出隐私感知联合DNN模型部署和分区优化技术,开启协作边缘推理新时代
科技·算法·dnn
小冯记录编程1 天前
深入解析C++ for循环原理
开发语言·c++·算法
chenchihwen1 天前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf