洛谷题单指南-字符串-P1470 [USACO2.3] 最长前缀 Longest Prefix
原题链接:https://www.luogu.com.cn/problem/P1470
题意解读:求s最长前缀长度,使得可以拆解成p集合中的字符串
解题思路:
动态规划:
设s字符串下标从1开始,p集合用set<string>保存所有的元素
状态表示:设f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素
状态计算:对于j = i - 1开始往后倒推最多10个,如果f[j] = true并且j+1~i之间子串在p中,说明f[i] = true
初始化:f[0] = true
结果:最大的i
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
set<string> p;
string s;
bool f[N]; //f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素
int ans;
int main()
{
string tmp;
bool first = true;
while(cin >> tmp)
{
if(tmp == ".") first = false;
else
{
if(first) p.insert(tmp);
else s += tmp;
}
}
s = " " + s; //s从1开始,比正常长度增加了1
f[0] = true;
for(int i = 1; i < s.size(); i++)
{
for(int j = i - 1; j >= 0 && j >= i - 10; j--) //j从i-1往回最多退10个长度
{
string ss = s.substr(j + 1, i - j); //提取j+1~i之间的子串
if(f[j] && p.count(ss) > 0) //如果f[j]为true且j+1~i之间子串在p中,说明前i个字符也符合要求
{
f[i] = true;
ans = max(ans, i);
}
}
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?