hdu2243.考研路茫茫——单词情结(Trie图 && 矩阵乘法)

[HDU2243]考研路茫茫-单词情节[Trie图|AC自动机|矩阵递推] 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4361    Accepted Submission(s): 1297 Problem Description 背单词,始终是复习英语的重要 阅读详情
背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele 也终于要开始背单词了。一天,Lele 在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。

于是Lele想,如果背了N 个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L , 只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义。

比如一共有2个词根aa 和 ab ,则可能存在104个长度不超过3的单词,分别为

(2个) aa,ab,
(26个)aaa,aab,aac...aaz,
(26个)aba,abb,abc...abz,
(25个)baa,caa,daa...zaa,
(25个)bab,cab,dab...zab。

这个只是很小的情况。而对于其他复杂点的情况,Lele实在是数不出来了,现在就请你帮帮他。

答案对 2 ^ 64 取模。


这道题和 POJ2278 是相似的,区别在于 poj2278 求的是长度恰为n 的不包含的,而这题求的是长度小于等于 n 的包含的,且模数为 2 ^ 64。模数很好解决,计算时直接定义成unsigned long long,就会自动取模。

最后的答案是:总方案数 - 不包含的。

那么怎么计算 A^1 + A^2 + A^3 + ... + A^L和 26^1 + 26^2 + 26^3 + ... +26^L 呢。对于 A,只需要在A 的基础上多加一列都赋值为 1,这样 A[ 0 ][ L + 1 ]  表示的就是前面 L - 1个的和,只不过最后答案要 - 1, 因为多计算了一个 0 次方。 可以自己大致在纸上画画。同样对于26 也这么做。

CODE:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAX_N = 50;
typedef unsigned long long ull;

struct node {
	int ch[26], ed, fl;
} t[MAX_N];
int sz, n, L;
char s[10];

void insert()
{
	int u = 0, l = strlen(s + 1);
	for (int i = 1; i <= l; i ++) {
		int c = s[i] - 'a';
		if (!t[u].ch[c]) t[u].ch[c] = ++ sz;
		u = t[u].ch[c];
	}
	t[u].ed = 1;
}

int q[10005];

void get_Fail()
{
	int hd = 0, tl = 0;
	t[0].fl = 0;
	for (int c = 0; c < 26; c ++)
		if (t[0].ch[c]) {
			t[t[0].ch[c]].fl = 0;
			q[++ tl] = t[0].ch[c];
		} 
	while (hd < tl) {
		int r = q[++ hd];
		for (int c = 0; c < 26; c ++) {
			if (!t[r].ch[c]) {
				t[r].ch[c] = t[t[r].fl].ch[c];
				continue;
			}
			q[++ tl] = t[r].ch[c];
			int u = t[r].ch[c], v = t[r].fl;
			while (v && !t[v].ch[c]) v = t[v].fl;
			t[u].fl = t[v].ch[c];
			if (t[t[u].fl].ed) t[u].ed = 1;
		}
	}
}

void init()
{
	for (int i = 1; i <= n; i ++)
		scanf("%s", s + 1),
		insert();
}

struct Matrix {
	ull mt[50][50];
} a;
ull ans = 0;

Matrix mul(Matrix a, Matrix b, int n)
{
	Matrix c;
	for (int i = 0; i <= n; i ++) 
		for (int j = 0; j <= n; j ++) {
			c.mt[i][j] = 0;
			for (int k = 0; k <= n; k ++) 
				c.mt[i][j] += a.mt[i][k] * b.mt[k][j];
		}
	return c;
}

Matrix mi(Matrix a, int k, int n)
{
	Matrix c;
	for (int i = 0; i <= n; i ++) 
		for (int j = 0; j <= n; j ++)
			if (i == j) c.mt[i][j] = 1;
			else c.mt[i][j] = 0;
	while (k) {
		if (k & 1) c = mul(c, a, n);
		a = mul(a, a, n);
		k >>= 1;
	}
	return c;
}

void doit()
{
	get_Fail();
	for (int i = 0; i <= sz; i ++)
		for (int j = 0; j < 26; j ++) 
			if (!t[t[i].ch[j]].ed)
				a.mt[i][t[i].ch[j]] ++;
	for (int i = 0; i <= sz + 1; i ++)
		a.mt[i][sz + 1] = 1;
	sz ++;
	a = mi(a, L, sz);
	for (int i = 0; i <= sz; i ++)
		ans += a.mt[0][i];
	ans --;
	for (int i = 0; i <= 50; i ++)
		for (int j = 0; j <= 50; j ++) a.mt[i][j] = 0;
	a.mt[0][0] = 26; a.mt[0][1] = a.mt[1][1] = 1; a.mt[1][0] = 0;
	a = mi(a, L, 1);
	ull ret = a.mt[0][0] + a.mt[0][1] - 1;
	ret -= ans;
	cout << ret << endl;
}

int main()
{
	while (scanf("%d%d", &n, &L) != EOF) {
		memset(t, 0, sizeof(t));
		sz = 0;
		for (int i = 0; i <= 50; i ++)
			for (int j = 0; j <= 50; j ++) a.mt[i][j] = 0;
		ans = 0;
		init();
		doit();
	}
	return 0;
}



Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙! 本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。 阅读详情

相关推荐

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 369

HDU-2243 考研路茫茫——单词情结(AC自动机 + 矩阵快速幂)

题目描述 背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。 于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词...

Irimsky 289

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

[AC自动机+矩阵快速幂] poj2778 与 hdu2243

poj 2778link 题面   给定了 mmm 个 A, C, G, T 构成的基因片段(字符串),让你构造一个不含这 mmm 个片段的,长度为 nnn 的由A, C, G, T构成的字符串,问有几种方式。 分析   这题刚开始以为有关动态规划哈希什么的,看了题解才发现这是AC自动机的构造神题。AC自动机的基本介绍网上有很多,这里就不赘述。   首先对于这 mmm 个字符串,可以建一个 AC 自动机,就如普通的AC自动机一样,维护 fail 数组,用 tr[i][j]tr[i][j]tr[i][j] 表

ECNU_SF的博客 357

STM32F103跑LVGL,用DMA加速刷屏,800*480大屏也能丝滑

本文详细介绍了如何在STM32F103芯片上通过DMA加速和内存优化,实现800*480大屏的LVGL流畅运行。通过FSMC+DMA硬件架构优化、双缓冲机制和LVGL参数调优,显著提升了界面刷新率和响应速度,适用于嵌入式GUI开发中的高性能需求场景。

weixin_30357231的博客 377

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

HDU-2243考研路茫茫——单词情结【AC自动机+矩阵快速幂】

看到L那么大就应该想到矩阵快速幂。 而且这道题和之前的POJ 2778. DNA Sequence很想。 我们只需要计算一下长度小于等于n的不包含特殊串的个数(矩阵中要增加一维代表每一行的sum),然后用总的可能数减去不包含的就是答案了(总的可能数很多人都是用矩阵写的,其实用等比数列求和公式就行了啊)。 #include<bits/stdc++.h> using namespace s...

qq_39921637的博客 278

以TMS320F28069为例,如何使用CCS建立DSP工程文件

以TMS320F28069为例,本文主要介绍了使用CCS建立DSP工程的流程

Honglong 2556

HDU2243--考研路茫茫——单词情结

Problem Description 背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。 于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根

SCUT_Pein 1025

手把手带你实现DAF-Net:零代码基础入门红外与可见光图像融合(从理论到实战)

本文介绍了红外与可见光图像融合技术及DAF-Net网络的应用。红外图像能捕捉热源但缺乏细节,可见光图像纹理丰富但在低光环境下表现不佳。DAF-Net采用双分支特征提取和动态注意力融合架构,能智能分配特征权重实现优势互补。文章详细讲解了环境配置、数据集准备(如TNO数据集)和预处理方法,并提供了DAF-Net的核心代码实现,包括特征提取、注意力融合和图像重建模块。通过该技术可在安防、自动驾驶等领域获得更优质的融合图像,提升视觉感知能力。

m0_71589036的博客 229

Matlab 曲面平滑与点云处理

曲面平滑是一种常见的数学和计算机图形学技术,可以用来消除噪声、填补数据间隙,以及改善曲面的外观。在点云处理中,曲面平滑也被广泛应用于重建、拟合和可视化等领域。本文将介绍如何使用 Matlab 进行曲面平滑和点云处理,并提供相应的源代码。通过以上步骤,我们可以使用 Matlab 进行曲面平滑和点云处理。你可以根据具体需求调整参数和算法,以获得理想的曲面平滑效果。接下来,我们可以使用平滑算法对三角化的网格进行曲面平滑。以上代码将绘制原始点云和重建后的点云,并在图形中显示坐标轴和图例。表示平滑的迭代次数。

QfcaLinux的博客 753

HDU 2243(AC自动机+矩阵快速幂)

传送门 题面: 背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。 于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单...

weixin_30487201的博客 267

试读源码在这里下载

试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4306

HDU 2243 考研路茫茫――单词情结 (AC自动机 + dp)

HDU 2243 考研路茫茫――单词情结 题意:给定一些词根,如果一个单词包含有词根,则认为是有效的。现在问长度不超过L的单词里面,有多少有效的单词? 思路:这道题和POJ 2778 是同样的思路。POJ 2778是要找出长度为L的单词里面有多少无效的单词。那么根据同样的方法构造矩阵,然后所有无效的单词个数为 A + A^2 + ... + A^l 个。而所有单词的个数为26 + 26

SIOFive的专栏 1486

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU2243 考研路茫茫——单词情结

考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3322    Accepted Submission(s): 943 Problem Description 背单词,始终是复习英语的重要环节。

eeeaaaaa的专栏 687

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【HDU No. 2243】单词情结 考研路茫茫——单词情结

【HDU No. 2243】单词情结 考研路茫茫——单词情结

代码改变世界 642

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HDU 2243 考研路茫茫——单词情结 AC自动机 加 矩阵乘法

HDU 2243 考研路茫茫——单词情结 AC自动机 加 矩阵乘法

NNDXNM的专栏 893

hdu_2243 _考研路茫茫――单词情结 (AC自动机+矩阵快速幂+...)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5873    Accepted Submissi

Vision 405

F - 考研路茫茫――单词情结 HDU - 2243

背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如”ab”,放在单词前一般表示”相反,变坏,离去”等。 于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是...

Jack_zhuiyi的博客 424

考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)

考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6853Accepted Submission(s): 2383 Problem Description 背单词,始终是复习英语的重要环节。在荒...

babing2770的博客 206

HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下的就是本题的答案了,不包含词根的单词数可以用AC自动机+矩阵保存转移状态,然后矩阵快速幂求出,但是这个题目需要求的是不大于 len 的单词数,所以需要给矩阵多增加一维,具体做法可以参考这个博客: ...

Falcon的博客 421

HDU 2243 考研路茫茫――单词情结 AC自动机 + 矩阵快速幂

根据AC自动机构造矩阵,然后丢到模板里跑一跑就好了。 设所有情况的总数为 sum,不合法数为 non,则答案anw = sum - non。 首先sum = sigma(26^i) (1 然后non 为 所有不含词根的情况。 对于所有的AC自动机上的节点 i 枚举下一个可能的字符,即‘a’ - ‘z’,然后根据自动机的规则肯定会转移到某个节点 j ,如果 j 及 j 通过fail指针

自在飞花 892

HDU2243 考研路茫茫――单词情结 AC自动机

题意:求不包含给定的串且长度不大于m的串的个数 思路:这题是POJ2778的加强版,方法是求出包含给定的串的个数,再用总的方法数去减这个数字,就是得到不包含给定的串的个数。 #include #include #include #include #include using namespace std; const int N=40; const int CHAR=26; typed

MY专栏 462

【HDU】 2243 考研路茫茫——单词情结 AC自动机+矩阵加速

考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3211    Accepted Submission(s): 921 Problem Description 背单词,始终是复习英语的重要环

poursoul 1150

hdu 2243 考研路茫茫——单词情结 (ac自动机+矩阵优化)

题意: 这题简直是个奇葩的题目。题目各处n个串,然后要求长度小与等于n且包含着n个串至少一个串的串的个数。 题解: 首先我们构造一个字典图节点个数的矩阵,这样可以求出长度等于L不包含n个串的个数,那么把之前的矩阵看成一个部分,这样求  { f[n] , 1 } = { f[n-1] , 1 } *{ 原矩阵 0 ; 1 1 } 这样就可以求出不包含且小于等于的个数,然后用总数-这个就得出了

ACM之梦 658

HDU 2243 考研路茫茫——单词情结

此题其实为综合算法,AC自动机DP+矩阵二分快速求幂。由于要求的是“至少”包含一个的情况,每次碰到这种词就必然要联想到反面,也就是一个都不包含的情况。因为是对2的64次方取模,其实直接用unsigned long long类型即可,其结果就是直接对2^64取模,而且为正,输出用%

1140
上一篇: poj2778.DNA Sequence (Trie图 && 矩阵乘)
下一篇: bzoj3172.单词(AC自动机)
ALXPCUN
博客等级 码龄11年 4粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值