1.练习项目  :

问题描述

小蓝有很多齿轮,每个齿轮的凸起和凹陷分别用一个字符表示,一个字符串表示一个齿轮。

图片描述

如果两个齿轮的对应位分别是同一个字母的大小写,我们称这两个齿轮是契合的。

例如:AbCDeFgh 和 aBcdEfGH 就是契合的,但是 abc 和 aBC 不是契合的。

这天,小蓝的弟弟小桥从抽屉里拿来了两个齿轮,小蓝想知道,这俩个齿轮是不是契合的。

特别需要注意的是,齿轮是环形的,所以是可以旋转的(顺时针和逆时针均可),如果是契合的,小蓝还想让你告诉他,最少将第一个齿轮旋转多少位,两个齿轮可以完全契合在一起。

例如: AbbCd 与 BcDaB,在将第一个齿轮逆时针旋转两位后,变成 bCdAb ,两个齿轮就完全契合在一起了。

输入格式

第一行输入一个正整数 n ,代表两个齿轮的长度。

第二行输入一个长度为 n 的字符串 S ,代表第一个齿轮。

第三行输入一个长度为 n 的字符串 T ,代表第二个齿轮。

输出格式

第一行输出一个字符串: Yes 或者 No 。代表两个齿轮是否契合。

如果可以契合,第二行输出一个整数,代表需要旋转的位数。

如果不可以契合,不用多余输出。

2.选择课程

在蓝桥云课中选择题库,选择题号5132并开始练习。

3.开始练习

(1)源码     :

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;
string s,t;
int nex[N];
bool tag;

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;cin>>n>>s>>t;
    for(int i=0;i<n;i++){
        s[i]=isupper(s[i])?tolower(s[i]):toupper(s[i]);
    }
    s=s+s;
    s=' '+s,t=' '+t;
    nex[0]=nex[1]=0;
    for(int i=2,j=0;i<=n;i++){
        while(j&&t[i]!=t[j+1])j=nex[j];
        if(t[i]==t[j+1])j++;
        nex[i]=j;
    }
    
    int ans=1e9;
    for(int i=1,j=0;i<=2*n;i++){
        while(j&&s[i]!=t[j+1])j=nex[j];
        if(s[i]==t[j+1])j++;
        if(j==n){
            tag=true;
            ans=min({ans,abs(i-n),2*n-i});
            
        }
    }
    
    if(tag)cout<<"Yes\n"<<ans<<'\n';
    else cout<<"No"<<'\n';
    return 0;
}

(2)检验结果

对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。

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

更多推荐