题解:P14245 [CCPC 2024 Shandong I] 左移

· · 题解

题目传送门

题目大意:

给我们 n 个字符串 s,最少将字符串左移几次,才能让字符串 s 的第一个字符和最后一个字符一样。

思路:

每进行一次左移 S_1 就会变成 S_n,S_2 就会变成 S_1。我们就可以枚举这个过程,变化过程就为:

s=s.substr(1)+s[0];

但是这个函数时间复杂度是很高的,如果每次都执行这个函数,那一定会超时。所以我们不能用这种方法。

那我们就要想别的方法:我们发现,当相邻的两个字母一样时,这个字符串就是美丽字符串。那我们可以通过这个从第一个去找,找到两个相邻且一样的字符,最后输出它们的位置。如果没有,就输出 \texttt{-1}

最后,上我的代码:

AC code

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    while(n--)
    {
        cin>>s;
        bool bj=1;//标记是否是美丽字符串
        if(s[0]==s[s.size()-1])//特判,判断是否本来就是美丽字符串
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<s.size()-1;i++)
            if(s[i]==s[i+1])
            {
                cout<<i+1<<endl,bj=0;
                break;
            }
        if(bj) cout<<-1<<endl//判断输出-1
    }
    return 0;
}