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

news2024/12/25 10:34:58

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

杭电OJ 题目地址

在这里插入图片描述

【题意】

单词和词根仅由小写字母组成。给定N个词根,求长度不超过L 且至少包含一个词根的单词可能有多少个?

若有两个词根aa和ab,则长度不超过3且至少包含一个词根的单词可能存在104个:aa, ab(两个)、aaa, aab, aac…aaz(26个)、aba, abb,abc…abz(26个)、baa, caa, daa…zaa(25个)、bab, cab, dab…zab(25个)。

【输入输出】

输入:

包含多个测试用例。每个测试用例都占两行。第1行有两个正整数N 和L (0<N <6,0<L <231 )。第2行有N 个词根,每个词根的长度都不超过5。

输出:

对每个测试用例,都单行输出满足条件的单词总数mod 264的值。

【样例】

在这里插入图片描述

【思路分析】

本题求解长度不超过L 且至少包含一个词根的单词可能共计多少个。

这道题和 POJ2778有两处不同。

  • 本题中长度不超过L ;POJ2778中长度为n。
  • 本题求解的是至少包含一个词根的单词数,POJ2778求解的是不包含遗传病片段的DNA序列数。

【算法设计】

① 求解由26个小写字母组成且长度不超过L 的单词数ans。

② 求解长度不超过L 且不包含词根的单词数res。

③ 长度不超过L 且至少包含一个词根的单词数为两者之差ansres。

【举个栗子】

① 长度不超过L 的单词数

长度不超过L 的单词包括长度为1的26个、长度为2的26^2 个……长度为L 的26^ L 个,其和值26+26^2 +…+26^L 为长度不超过L 的单词数,如何计算呢?

对等比矩阵求和有经典算法,假定原矩阵为 A ,阶数为n ,则构造一个阶数为2n 的矩阵,其中0代表0矩阵, E 代表单位矩阵:

|A E|
|0 E|

求出的K 次矩阵的右上n 子矩阵正好是等比矩阵的K 项和。

在这里插入图片描述

求出矩阵的n 次幂的第1行之和减1,即可得到ans=26^1 +26^2 +…+26^(n -1) +26^n ,因为mod 2^64 ,所以直接用unsigned long long就可以了,系统会自动截断,相当于取模运算。

② 长度不超过L 且不包含词根的单词数

现在求解不超过L 且不包含词根的单词数,需要将所有长度小于或等于L 且不包含词根的单词数累加。要实现累加结果,只需在矩阵最后一行添加0,在最后一列添加1即可。

根据输入样例1的词根{aa ab}构建AC自动机,如下图所示。

在这里插入图片描述
不包含词根的原矩阵如下:

25 1
24 0

为实现累加效果,在原矩阵的最后一行添加0且在最后一列添加1,单位矩阵变为:

25 1 1
24 0 1
0  0 1

若M [i , j ]表示从节点i 到j 只走1步有几种走法,则 M 的n 次幂表示从节点i 到j 走n 步有几种走法。求出矩阵的n 次幂第1行之和减1,得到长度不超过L 且不包含词根的单词数res。

③ 长度不超过L 且至少包含一个词根的单词数

长度不超过L 且至少包含一个词根的单词数为两者之差ans-res。

【算法实现】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>

using namespace std;

typedef unsigned long long ll;

const int maxn=40;
const int K=26;
int root,L;

struct mat{
	ll a[maxn][maxn];
	int n;
	mat(int _n){
		n=_n;
		memset(a,0,sizeof(a));
	}
};

mat mul(mat A,mat B){//矩阵乘法
    mat C(A.n);
    for(int i=0;i<A.n;i++)
        for(int j=0;j<B.n;j++)
            for(int k=0;k<A.n;k++)
                C.a[i][j]+=A.a[i][k]*B.a[k][j];
    return C;
}

mat pow(mat A,int n){//A^n
    mat ans(A.n);
    for(int i=0;i<A.n;i++)
        ans.a[i][i]=1;//单位矩阵 
    while(n>0){
        if(n&1)
			ans=mul(ans,A);
        A=mul(A,A);
        n>>=1;
    }
    return ans;
}

struct ACAutomata{
    int next[maxn][K],fail[maxn],end[maxn],id[maxn];
    int newNode(){//新建结点
        for(int i=0;i<K;i++)
			next[L][i]=-1;
        end[L]=0;
        return L++;
    }
    void init(){//初始化
        L=0;
        root=newNode();
    }
    void insert(char s[]){//插入一个结点
        int len=strlen(s);
        int p=root;
        for (int i=0;i<len;i++){
            int ch=s[i]-'a';
            if(next[p][ch]==-1)
				next[p][ch]=newNode();
            p=next[p][ch];
        }
        end[p]++;
    }
    void build(){//构建AC自动机
        queue<int> Q;
        fail[root]=root;
        for (int i=0;i<K;i++){
            if(next[root][i]==-1){
                next[root][i]=root;
            }
			else{
                fail[next[root][i]]=root;
                Q.push(next[root][i]);
            }
        }
        while(Q.size()){
            int now=Q.front();
            Q.pop();
            if(end[fail[now]])
				end[now]++;//重要!!如果当前结点的失败指针end有结束标记,当前结点的end++ 
            for(int i=0;i<K;i++){
                if (next[now][i]!=-1){
                    fail[next[now][i]]=next[fail[now]][i];
                    Q.push(next[now][i]);
                }
				else
					next[now][i]=next[fail[now]][i];
            }
        }
    }

    ll query(int n){
        int ids=0;
        memset(id,-1,sizeof(id));
        for(int i=0;i<L;i++)//对未标记的结点重新编号 
        	if(!end[i])
        		id[i]=ids++;
        mat F(ids+1);		
        for(int u=0;u<L;u++){
        	if(end[u]) continue;
        	for(int j=0;j<K;j++){
                int v=next[u][j];
                if(!end[v])
					F.a[id[u]][id[v]]++;
            }
		}
		for(int i=0;i<ids+1;i++)
			F.a[i][ids]=1;

	    F=pow(F,n);

	    ll res=0;
	    for(int i=0;i<L;i++)
	    	res+=F.a[0][i];
	    return --res;
    }
}ac;

ll pow_2(int n){//求26+26^2+...+26^n
	mat C(2);
    C.a[0][0]=26;
    C.a[0][1]=C.a[1][1]=1;
    C=pow(C,n);
    ll ans=C.a[0][0]+C.a[0][1];
    return --ans;
}

int main(){
	
    int m,n;
    char str[20];
    while(~scanf("%d%d",&m,&n)){
        ac.init();
        while (m--){
            scanf("%s",str);
            ac.insert(str);
        }
        ac.build();
        cout<<pow_2(n)-ac.query(n)<<endl;
    }
	
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO流,,

标题1. 文件基础知识1.1 文件基础知识-文件流1.2 创建文件的3种方式(不是目录)3. 获取文件的相关信息4. 删除文件及创建多级(一极)目录2. IO流原理及流的分类2.1 InputStream 字节输入流2.1.1 FileInputStream2.1.2 FileOutStream2.1.3 拷贝文件2.2 FileReader2.3 FileWriter2.…

MyCat教程【mysql主从复制实现】

单个mysql数据库在处理业务的时候肯定是有限的&#xff0c;这时我们扩展数据库的第一种方式就是对数据库做读写分离&#xff08;主从复制&#xff09;,本文我们就先来介绍下怎么来实现mysql的主从复制操作。 1. 读写分离 原理&#xff1a;需要搭建主从模式&#xff0c;让主数…

Python实现房产数据分析与可视化 数据分析 实战

Python库的选择 话说&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;虽然我们已经选择Python来完成剩余的工作&#xff0c;但是我们需要考虑具体选择使用Pytho的哪些利器来帮助我们更快更好地完成剩余的工作。 我们可以看一下&#xff0c;在这个任务中&#xff0c…

elasticsearch global 、 filters 和 cardinality 聚合

文章目录1. 背景2、解释1、global2、filters3、cardinality3、需求4、前置条件4.1 创建mapping4.2 准备数据5、实现3的需求5.1 dsl5.2 java 代码5.3 运行结果6、实现代码7、参考文档1. 背景 此处将单记录一下 global 、 filters和cardinality的聚合操作。 2、解释 1、global…

C++学习笔记(十八)——stack和queue

stack stack的介绍 stack接口的介绍 queue queue的介绍 queue接口的介绍 stack stack的介绍 stack是一种先进后出的容器. stack是一种容器适配器,专门用在具有后进先出(last-in first-out)操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作.stack是作…

Java——封装——Encapsulation

封装什么是封装访问权限修饰符导入import一个包package&#xff1f;Static到底是什么面向对象的三大特征&#xff1a;封装、继承、多态。今天我们来浅谈一下封装。什么是封装 我们不用那么专业那么难懂的语言讲解&#xff0c;我们就走一波野路子&#xff1a;封装就是指用priva…

理想汽车季报图解:营收93亿运营亏损21亿 沈亚楠卸任总裁职务

雷递网 雷建平 12月9日理想汽车&#xff08;纳斯达克&#xff1a;LI&#xff1b;香港交易所&#xff1a;2015&#xff09;今日公布财报。财报显示&#xff0c;理想汽车2022年第三季度营收93.4亿元&#xff08;13.1亿美元&#xff09;&#xff0c;较上年同期的77.8亿元增长20.2%…

【考研数据】一.2020年BJTU计算机学院考研录取数据分析

欢迎订阅本专栏:《北交计算机复试经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_12110003.html 【考研数据】一.2020年BJTU计算机学院考研录取数据分析【考研数据】二.2021年BJTU计算机学院考研录取数据分析【考研数据】三.2022年BJTU计算机学院考研录取数据分…

vue.js:父子组件的实训案例watch实现

作业需求 需求1&#xff1a;定义两个输入框&#xff0c;通过输入框输输入的值改变页面显示的值需求2&#xff1a;改变第一个输入框的值的同时使得第二个输入框的值变为100倍并显示需求3&#xff1a;改变第二个输入框的值的同时使得第一个输入框的值变为1/100并显示用watch实现…

Redis 特性。

Remote Dict Serve 分类 实时同步数据 要求缓存中的数据必须与db中的数据保持一致&#xff0c;如何保证&#xff0c;只要DB发生了变化&#xff0c;缓存中的数据立即消息 阶段性缓存为了缓存数据 添加了生存时长属性 Redis 的特性。 性能极高 读的速度 11w/s 写的速度 8w次/s…

10.spring源码之registerListeners()

1. 准备 ApplicationEvent: 事件对象&#xff0c;Spring事件驱动模型中的对象源&#xff0c;继承JDK EventObject&#xff0c;通过在发布事件时通过EventObject.source字段携带事件相关的数据。 ApplicationListener: 应用监听器&#xff0c;负责监听事件对象是否有发生变化&a…

学习Java8 Stream流,让我们更加便捷的操纵集合

1. 概述 本篇文章会简略的介绍一下 Lambda 表达式&#xff0c;然后开启我们的正题 Java8 Stream 流&#xff0c;希望观众老爷们多多支持&#xff0c;并在评论区批评指正! Java8 的 Stream 流使用的是函数式编程模式。它可以被用来对集合或数组进行链状流式的操作&#xff0c;…

推荐系统基本问题及系统优化路径

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点大规模推荐类深度学习系统的设计实践.pdf荣耀推荐算法架构演进实践.pdf推荐系统在腾讯游戏中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&…

产品设计杂感

概述 前面多篇文章提过我近一年以来几乎是一个人在负责一款数据产品&#xff0c;一款公司内部使用的报表开发工具。市面上的类似产品如Tableau&#xff0c;QuickBI等。工作角色&#xff08;职责&#xff09;包括&#xff1a;后端开发&#xff0c;前端开发&#xff0c;功能测试…

STM32 bootloader简单实现的验证

目录 背景知识 STM32的启动模式 Flash memory的大小 实验验证 分区分配 bootloader代码 systeminit 背景知识 STM32的启动模式 STM32有三种启动模式, 这里验证的bootloader是通过Flash memory启动方式, 使用STM32内置的Flash,其首地址是0x08000000&#xff0c;一般我们…

[论文阅读] 颜色迁移-梯度保护颜色迁移

[论文阅读] 颜色迁移-梯度保护颜色迁移 文章: [Gradient-Preserving Color Transfer], [代码未公开] 本文目的: 如题所示为梯度保护的颜色迁移方法. 1-算法原理 人类的视觉系统对局部强度差异比强度本身更敏感, 因而, 保持颜色梯度是场景保真度的必要条件, 因而作者认为: 一…

python+django留守儿童爱心捐赠网站

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究…

城市应急处置系统实施目标

针对需求分析中的业务目标&#xff0c;本系统在实施中&#xff0c;通过 “两个工作台七个子系统”的目标来支撑业务目标&#xff0c;满足系统延续需求、功能需求、制度建设需求、平台拓展需求和技术性能需求。 具体分为事前6个子系统、事中2个工作台和事后1个子系统这三方面目标…

002:UIView

UIView简介&#xff1a; UIView作为最基础的视图类&#xff0c;起着管理屏幕上一定区域内容展示的作用。作为各种视图的父类&#xff0c;提供相应的基础能力。 外观、渲染和动画。相应区域内的事件。布局和管理子视图。 布局&#xff1a; 设置自身大小&#xff08;size&…

[附源码]Python计算机毕业设计SSM基于农产品交易系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…