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 s[N],t[N];
typedef unsigned long long ull;
const ull base = 131;
ull h1[N],h2[N],b[N];

ull getHash(ull h[],int l,int r)
{
    return h[r]-h[l-1]*b[r-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;
    b[0]=1;
    for(int i=1;i<=n;i++){
        b[i]=b[i-1]*base;
        h1[i]=h1[i-1]*base+(int)s[i];
        if(i<=m)h2[i]=h2[i-1]*base+(int)t[i];
    }
    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)练习心得:注意每段代码末尾的分号是否存在  ,如不存在则需即使补充;输入法  是否切换为英语模式;语法是否错误。

更多推荐