UVA12244 Growing Strings

news/2025/3/9 10:17:55/文章来源:https://www.cnblogs.com/Tmbcan/p/18760323

UVA12244 Growing Strings

题面

形式化题意

给定 \(N\) 个字符串 \(S_1 \dots S_N\),从中选出一些字符串首尾相接依次排成一个序列。在序列中,前面串是后面串的子串。
每组数据输出一行一个整数,表示最多可以选择的字符串个数。

思路

对于字符串匹配问题,第一时间想到 AC 自动机。

AC 自动机利用失配 Fail 指针来辅助多模式串的匹配。
Fail 指针指向所有模式串的前缀中匹配当前状态的最长后缀

不难发现 Fail 指针与我们本题字符串匹配模式十分相似。
那么本题的解法就很容易想到了。

AC 自动机+DP

\(dp[i]\) 表示以节点 \(i\) 结尾时最多可以选多少个字符串。
需知道以其父亲节点\(Fail\) 节点为结尾的可选字符串数量,再加上以 \(i\) 为结尾的字符串数量
\(dp[i]= \max(dp[i\_father],dp[i\_fail])+num[i]\)

样例解释:

对于样例一:

我们只要在构建 Fail 树的同时进行 DP,就可以找到最多可选字符串的数量了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
template <typename T>
inline void read(T&x){//快读 int w=0;x=0;char ch = getchar();while(ch<'0'||ch>'9'){if(ch=='-') w=1;ch = getchar();}while(ch>='0'&&ch<='9'){x = (x<<1)+(x<<3)+(ch^48);ch = getchar();}if(w) x=-x;
}
template <typename T,typename...Args>
inline void read(T&t,Args&...args){read(t);read(args...);
}
inline int max(int a,int b){return (a > b ? a : b);
}
#define mian mainconst int N = 1e6+5;
int n;
char s[N];
struct TRIE{int son[27],fail,num;//宏定义qwq #define son(x,y) Trie[x].son[y]#define fail(x) Trie[x].fail#define num(x) Trie[x].num
//	TRIE(){
//		memset(son,0,sizeof(son));
//		fail = pos = fu = ind = num = 0;
//	}
}Trie[N];
int dp[N],rt=0,cnt;
inline void insert(char *s){//建Trie树 int now = rt;int len = strlen(s);for(int i=0;i<len;++i){int c = s[i]-'a';if(!son(now,c)) son(now,c) =  ++cnt;now = son(now,c);}++num(now);
}
queue <int> q;
inline void get_fail(){//建Fail树 int res = 0;q.push(0);while(q.size()){int now = q.front();q.pop();int tfail = fail(now);if(num(tfail)) num(now) = 1;for(int i=0;i<26;++i){int tson = son(now,i);if(tson) q.push(tson);else son(now,i) = son(tfail,i);if(now) fail(tson) = son(tfail,i);//Root==0根 dp[tson] = max(dp[now],dp[fail(tson)])+num(tson);//建树同时更新节点信息 res = max(res,dp[tson]);}	}printf("%d\n",res);
}
inline void Init(){memset(Trie,0,sizeof(TRIE)*(cnt+1));memset(dp,0,sizeof(dp));cnt = 0;
}
int main(){while(1){read(n);if(!n) break;Init();//多测清空while(n--){scanf("%s",s);insert(s);}get_fail();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四课 句法结构与依存分析

人类理解自然语言的方式有很多,但是绝大多数用的还是通过上下文来推断某些词的含义。现代自然语言处理也是基于这个方式来进行建模的 我们来看一个例子,如下可以知道,in,large是修饰crate的,look是修饰in the crate的,in the kitchen是修饰crate的,by the door也是修饰c…

3.9 android真机测试通过了

deepseek简直太厉害了,我昨天写的代码一直报错访问不了网络,然后我就跟deepseek描述我的错误 跟着它给的解决办法开放了防火墙端口,之后就可以通过了,成功的在真机上将信息提交到了数据库

值班员空岗状态监测防睡觉系统

值班员空岗状态监测防睡觉系统是完善监管部门动态监控及预警预报体系的信息化手段,是实现智慧消防平台远程监控由“人为监控”向“智能监控”转变的必要手段。产品致力于服务智慧值班室平台智能化建设,有效实现对值班室人员离岗智能检测的实时预警,包括视频监管、事件预警、…

130道基础OJ编程题之: 78\~88

130道基础OJ编程题之: 78~88 @目录130道基础OJ编程题之: 78~8878: BC87 统计成绩79: BC89 密码验证80: BC90 矩阵计算81: BC92 逆序输出82: BC93 统计数据正负个数83: BC94 N个数之和84: BC95 最高分与最低分之差85: BC96 有序序列判断86: BC98 序列中删除指定数字87: BC99 序列…

智慧消防监控预警系统解决方案

智慧消防监控预警系统是智慧消防物联网平台智能采集终端,是创新消防行业监督管理方式、完善消防监管部门动态监控及预警预报体系的信息化手段,是实现智慧消防平台远程监控由“人为监控”向“智能监控”转变的必要手段。产品致力于服务智慧消防平台智能化建设,有效实现对消防…

行人车辆过街智能红绿灯自动控制系统

智能红绿灯自动控制系统采用智能人员监测分析摄像机,可以实时监测行人数量来智能转换红绿灯,为等候过街的行人提供便利,减少行人和机动车等候的时间。用于设置触发交通灯由红灯切换为绿灯的等候人数,达到该阈值则相机输出开关量触发交通灯切换。系统默认值为8人,考虑到等候…

代码照进现实:对公司管理策略的技术性解构

春节期间拍摄于南京上学的时候觉得计算机专业的一些理论晦涩难懂,跟现实世界的关联太少,每当遇到一些精妙的设计时都会发出一种感叹:究竟是什么脑袋才能想出这么有意思的东西。一晃工作十年,阅历渐丰,隐约发现其实社会中的一些现象其实和软件工程的一些理念有异曲同工之妙…

胆儿真大这也敢搞!

分享一款大佬基于官方版本修改的便捷版微信,不但能即开即用,还能多开、防撤回:微信PC多开防撤回便捷版;用电脑版微信的小伙伴都遇到过两个很头疼的问题,一是不支持多开,想要同时登录多个微信账号,还得使用bat脚本,对于那些不懂编程并且需要在电脑上管理多个账号的人来说…

又一国产AI爆火!Manus强势炸场,邀请码申请方法,看这一篇就够了!

3月6日凌晨,一款名为Manus的国产AI产品横空出世,迅速霸榜社交平台热搜。其内测邀请码在二手交易平台被炒至5万元天价,甚至出现标价10万元的卖家,我的个乖乖啊。 究竟是什么让Manus如此火爆?今天我们来聊一聊。 Manus是个啥? 与ChatGPT、DeepSeek等传统对话式AI不同,Manu…

VMware ESXi 6.7U3v macOS Unlocker OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版) 此版本解决的问题:VMware Host Client 无法将现有虚拟磁盘 (…

读DAMA数据管理知识体系指南14数据库环境

读DAMA数据管理知识体系指南14数据库环境1. ACID 1.1. 缩写词ACID是在20世纪80年代末期出现的一个合成词,含义是保证数据库事务可靠性不可或缺的约束 1.2. 原子性(Atomicity)1.2.1. 所有操作要么都完成,要么一个也不完成1.2.2. 如果事务中的某部分失败,那么整个事务就都会失…

opera在搜索引擎页面,无法使用用户脚本

如图只要是搜索结果页面都不能激活扩展。 我使用了链接助手这个在任何页面都能使用的脚本只有暴力猴提了一嘴,搜索引擎上完全搜索不到类似的问题。我在设置中找了半天,并没有找到类似权限的字样。于是去找了github的issue。 最终误打误撞的 https://github.com/dhowe/AdNause…