1.练习项目 :
问题描述
小桥是一名喜欢研究文学的学生,最近她在研究一种名为"诗歌双联"的文学形式,它可以将两个诗句拼接在一起,形成新的诗句。为了更好地研究这种文学形式,小桥准备了两个字符串 s 和 t。
她发现,如果从字符串 s 中选出两个长度为 k 的不相交子串,并将它们拼接在一起(不能改变相对顺序),可能会形成一个包含 t 的字符串。为了验证这个想法,她想设计一种算法来检验是否可以这样做。
输入格式
第一行包含三个整数 n,m,k (2≤m≤2⋅k≤n≤104),表示字符串 s 和字符串 t 的长度,以及可选子串的长度。
接下来两行是由小写字母组成的字符串 s 和 t。
输出格式
如果可以选出的两个子串,使得拼接后得到的字符串包含 t,则输出 "Yes",否则输出 "No"。
2.选择课程
在蓝桥云课中选择题库,选择题号1071并开始练习。
3.开始练习
(1)源码 :
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
char sN,tN;
typedef unsigned long long ull;
const ull base = 131;
ull h1N,h2N,bN;
ull getHash(ull h\[\],int l,int r)
{
return hr-hl-1*br-l+1;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m,k;cin>>n>>m>>k;
cin>>s+1>>t+1;
b0=1;
for(int i=1;i<=n;i++){
bi=bi-1*base;
h1i=h1i-1*base+(int)si;
if(i<=m)h2i=h2i-1*base+(int)ti;
}
for(int i=1;i+m-1<=n;i++){
if(getHash(h1,i,i+m-1)==getHash(h2,1,m)){
cout<<"Yes"<<'\n';
return 0;
}
}
for(int i=1;i<m;i++){
if(i>k||m-i>k)continue;
int l=k,r=n-k+1;
while(l<r){
if(getHash(h1,l-i+1,l)==getHash(h2,1,i)&&getHash(h1,r,r+m-i-1)==getHash(h2,i+1,m)){
cout<<"Yes"<<'\n';
return 0;
}
if(getHash(h1,l-i+1,l)!=getHash(h2,1,i))l++;
if(getHash(h1,r,r+m-i-1)!=getHash(h2,i+1,m))r--;
}
}
cout<<"No"<<'\n';
return 0;
}
(3)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(4)练习心得:注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法 是否切换为英语模式;语法是否错误。