这个题没有用到什么定理函数之类的,有的只是要学会发现规律,题目最直观的解法很有可能会超时,从另一个角度来说,这也不利于我们的训练。
通过不断地尝试,我们可以发现:
1、类似于010101,最后是000111,也就是说前一半的值等于第一个,后一半的值等于最后一个
2、类似于01010,即首尾相同,那么最后结果是00000;而10101,结果是11111
3、我们在这里把这样的串称为重要字串,可以发现在重要字串A+00+重要字串B中,AB互不影响
4、不会出现不稳定的串
5、最后的变化次数与最长的重要字串的长度-2(去掉首尾项,记做len)有关,这里记做res
#include <iostream>
using namespace std;
int n;
int a[500005];
int b[500005];
int main()
{
cin>>n;
int i,j,len,res=0;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
{
for(j=i;j<n-1;j++)
{
if(a[j]==a[j+1]) break;//定位到重要字串的最后一个位置j
}
if(a[j]==a[i])//if-else是对重要字串进行改变字符的操作
for(int m=i;m<=j;m++) b[m]=a[i];
else
{
for(int m=i;m<=(i+j)/2;m++) b[m]=a[i];
for(int m=(i+j)/2+1;m<=j;m++) b[m]=a[j];
}
len=j-i-1;
if(len>res) res=len;
i=j;
}
cout<<(res%2+res/2)<<endl;//容易发现答案就是这个式子
for(i=0;i<n-1;i++) cout<<b[i]<<' ';
cout<<b[i];
return 0;
}