P2799 国王的魔镜 题解

难度:⭐⭐⭐
知识点:模拟
题目链接

序言:

我看题解中各种方法我这个蒟蒻都理解不了,所以我决定来发一篇模拟也能AC的代码。

1.入手程序

根据题意,我们的模拟过程就是倒退项链的变化过程。那么项链在什么情况下可以增长呢?不妨先看看样例:

    ABBAABBA
    2

样例中的项链的变化过程如下:
AB->ABBA->ABBAABBA

因此,可以推导出两条规则:

(1)项链只要变化过,它的长度就一定是偶数。

(2)项链只要变化过,它就一定是一个回文字符串(类似于回文数)。

2.编程思路

上面推导出了两项规则,但是还不足以帮助我们来模拟项链变化过程,因为它是正向的,于是继续推导,终于推出了代码的核心!

如果项链的长度是偶数且回文,它就有可能是变化过的。

并且由于我们要求最初的项链可能的最小长度,所以就意味着......

如果项链的长度是偶数且回文,它项链的长度就能缩短!

所以,我们的任务就是模拟这个过程。

3.AC代码

终于到了激动人心的AC时刻!

#include<bits/stdc++.h>
using namespace std;
string s;
//递归倒推
int mj(string s)
{
    int sl=s.size();
    //如果是奇数就一定是最开始的结果
    if(sl%2==1)
    {
        return sl;
    }
    string s2=s;
    reverse(s2.begin(),s2.end());//rerse函数是判断一个字符串是否回文的一个工具,具体用法为:reverse(字符串.begin(),字符串.end())

    //如果是偶数就据续处理
    if(s==s2)
    {
        string ts;
        for(int i=1;i<=sl/2;i++)
        {
            ts+=s[i-1];
        }
        return mj(ts);
    }
    return sl;
}
int main()//好短的主函数啊~
{
    cin>>s;
    cout<<mj(s);//直接输出处理后的结果
    return 0;
}

我是千文杜博,记住我呦~~

The end