C++课后习题训练记录Day138

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)练习心得:注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法 是否切换为英语模式;语法是否错误。