题解 CF2164D Copy String
题解 CF2164D Copy String
- 【本版】25/11/2025 更新:怎么忘记打代码块了呜呜……实在抱歉,一篇题解交了三次
- 25/11/2025 更新:修复了数学语言问题。
不过 OI 不都是这么写吗(s[l,r] 表示从s_l 到s_r 的子串)
其他题
题意
给定字符串
试问能否用不超过
数据范围:多测,
做法
容易想到一种直接匹配的方法:枚举
但是这个东西跑样例 #5 会输出
10 3
vzvylxxmsy
vvvvvllxxx
原因是
所以上述方法求出来的方案不是最优的。
于是考虑当当前
然后会发现我把
然后发现他是放
:::success[代码]
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<fstream>
#include<algorithm>
#include<map>
#include<unordered_map>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<cassert>
#define ll long long
#define lf double
#define ld long double
using namespace std;
ll T,n,k,l[1000010],r[1000010],lst[30];
string s,t;
bool work(ll now){
ll p=0;
bool flg=0;
memset(lst,-1,sizeof(lst));
for(int i=0;i<n;i++){
if(p<i){
flg=1;
break;
}
l[i]=p;
while(p<n&&t[p]==s[i]){
if(p-1-i==now)break;
p++;
}
r[i]=p-1;
}
if(flg){
return false;
}
string tmp=s;
for(int i=1;i<=now;i++){
for(int j=0;j<n;j++){
if(j+i<=r[j]){
tmp[j+i]=s[j];
}
}
}
if(tmp!=t){
return false;
}
cout<<now<<endl;
tmp=s;
for(int i=1;i<=now;i++){
for(int j=0;j<n;j++){
if(j+i<=r[j]){
tmp[j+i]=s[j];
}
}
cout<<tmp<<endl;
}
return true;
}
int main(){
ios::sync_with_stdio(0);
cin>>T;
while(T--){
cin>>n>>k>>s>>t;
bool flg=0;
for(int i=0;i<=k;i++){
if(work(i)){
flg=1;
break;
}
}
if(!flg){
cout<<-1<<endl;
}
}
return 0;
}
:::