[UVALive3942] Remember the Word && 字符串

本文深入探讨了Trie树与动态规划结合的应用,详细解释了如何利用Trie树进行字符串匹配和解决特定问题,提供了实例代码和解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Trie树上的DP 讲解白树有

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define SF scanf
#define PF printf
#define max(a, b) ((a) < (b) ? (b) : (a))
using namespace std;
typedef long long LL;
const int MAXN = 300000;
const int MAXL = 400000;
const int SZ = 26;
const int MOD = 20071027;
char s[MAXN+10];
int d[MAXN+10];
struct Trie_Tree
{
	int ch[MAXL+10][SZ+10];
	int val[MAXL+10];
	int sz;
	void init() {
		sz = 1; val[0] = 0; memset(ch[0], 0, sizeof(ch[0]));
	}
	inline int ID(char c) { return c - 'a'; }
	void insert(char *s)
	{
		int n = strlen(s), u = 0;
		for(int i = 0; i < n; i++)
		{
			int c = ID(s[i]);
			if(!ch[u][c])
			{
				memset(ch[sz], 0, sizeof(ch[sz]));
				val[sz] = 0;
				ch[u][c] = sz++;
			}
			u = ch[u][c];
		}
		val[u] = n;
	}
	void Find(char *s, int p, int Len)
	{
		int u = 0;
		for(int i = 0; i < Len; i++)
		{
			int c = ID(s[i]);
			if(!ch[u][c]) return ;
			u = ch[u][c];
			if(val[u]) d[p] = (d[p] + d[p + val[u]]) % MOD;
		}
	}
}trie;
int main()
{
	int kase = 0;
	char t[110];
	while(~SF("%s", s))
	{
		int N; SF("%d", &N);
		int Len = strlen(s);
		trie.init();
		d[Len] = 1;
		for(int i = 0; i < N; i++) { SF("%s", t); trie.insert(t); }
		for(int i = Len-1; i >= 0; i--) 
		{
			d[i] = 0;
			trie.Find(&s[i], i, Len-i);
		}
		PF("Case %d: %d\n", ++kase, d[0]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值