Description
定义一个数字为幸运数字当且仅当它的所有数位都是444或者777。
比如说,47、744、447、744、447、744、4都是幸运数字而5、17、4675、17、4675、17、467都不是。
假设现在有一个数字ddd,现在想在ddd上重复kkk次操作。
假设ddd有nnn位,用d1,d2,...,dnd_1,d_2,...,d_nd1,d2,...,dn表示。
对于每次操作,我们想要找到最小的x(x<n)x (x < n)x(x<n),使得dx=4d_x=4dx=4并且dx+1=7d_{x+1}=7dx+1=7。
如果xxx为奇数,那么我们把dxd_xdx和dx+1d_{x+1}dx+1都变成444;
否则,如果xxx为偶数,我们把dxd_xdx和dx+1d_{x+1}dx+1都变成777;
如果不存在xxx,那么我们不做任何修改。
现在请问kkk次操作以后,ddd会变成什么样子。
Input
第一行两个整数n,kn,kn,k表示ddd的长度和操作次数。
第二行一个数表示ddd。数据保证不存在前导零。
(1≤n≤105,0≤k≤109)(1\le n\le 10^5,0\le k\le 10^9)(1≤n≤105,0≤k≤109)
Output
一个数字表示答案。
Sample Input
7 4
4727447
Sample Output
4427477
Solution
对于偶数位置的474747,若前一个位置是444,那么就会有循环447→477→447→...447\rightarrow 477\rightarrow 447\rightarrow...447→477→447→...
对于奇数位置的474747,若后一个位置是777,那么就会有循环477→447→477→...477\rightarrow 447\rightarrow 477\rightarrow ...477→447→477→...
只要有这两种情况则不用进行后续操作,直接判断剩余操作次数的奇偶性即可,否则一个个往后更新
时间复杂度O(n)O(n)O(n)
Code
#include<cstdio>
using namespace std;
const int maxn=100005;
int n,k;
char s[maxn];
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+1);
for(int i=1;i<n;i++)
if(s[i]=='4'&&s[i+1]=='7')
{
if((i&1)&&i+2<=n&&s[i+2]=='7')
{
if(k&1)s[i+1]='4';
k=0;
}
else if(!(i&1)&&i-1>=1&&s[i-1]=='4')
{
if(k&1)s[i]='7';
k=0;
}
else
{
if(i&1)s[i+1]='4';
else s[i]='7';
k--;
}
if(!k)break;
}
printf("%s\n",s+1);
return 0;
}