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;
}