CF1714D 题解
CF1714D 题解
description
给定黑色文本
- 测试数据组数
solution
线性dp。
其中
特别地,若不存在这样的
答案即为
为了输出方案,我们记录每个
由于需要检查字符串是否在 std::map
匹配字符串,可将匹配复杂度从
code
#include<bits/stdc++.h> using namespace std; const int N=1010; string t,s[110]; int f[N],n,pre[N],len[N]; map<string,bool> mp; map<string,int> num; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr),cout.tie(nullptr); int T; cin>>T; while(T--){ memset(pre,0,sizeof pre); memset(len,0,sizeof len); mp.clear(); num.clear(); f[0]=0; cin>>t>>n; for(int i=1; i<=n; i++) s[i].clear(); for(int i=1; i<=n; i++) cin>>s[i]; for(int i=1; i<=n; i++){ reverse(s[i].begin(),s[i].end()); //倒着存字符串,方便dp的时候匹配 mp[s[i]]=true; num[s[i]]=i; } f[t.size()+1]=INT_MAX/2; //避免+1爆int for(int i=1; i<=t.size(); i++){ string now; f[i]=INT_MAX/2; int minx=t.size()+1; //记录从哪里转移 for(int j=i; j; j--){ now+=t[j-1]; if(f[minx]>f[j-1]){ minx=j-1; } if(mp.find(now)!=mp.end()){ if(f[i]>f[minx]+1){ f[i]=f[minx]+1; pre[i]=minx; len[i]=now.size(); } } } } if(f[t.size()]==INT_MAX/2){ cout<<-1<<'\n'; continue; } int st=t.size(); cout<<f[t.size()]<<'\n'; while(st){ string q=t.substr(st-len[st],len[st]); //此处记录了每个位置用了多长的字符串来涂色 reverse(q.begin(),q.end()); cout<<num[q]<<' '<<st-len[st]+1<<'\n'; st=pre[st]; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】