【问题描述】
Lsy喜欢幸运数字,众所周知,幸运数字就是数字位上只有4和7的数字。
但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列。哈哈,是不是感觉被耍了,没错,你就是被耍了。
Lsy现在手上有一个长度为N的幸运序列a,他想这样子折腾这个序列:
- 如果已经折腾了k次了,就结束,否则找到一个最小的i,使得(a[i]=’4’ && a[i+1]=’7’) //0<i<N;
- 找不到这样的i就结束;
- 如果odd(i),令a[i+1]=a[i],否则令a[i]=a[i+1],继续第一步。
Lsy想让你告诉他最后序列折腾成什么样子了。
需要注意的是,本题的序列从1开始编号
【输入文件】
第一行N,K;
第二行N个数描述序列a。
【输出文件】
N个数,输出最后的序列。
【输入样例】
7 4 4727447 |
【输出样例】
4427477 |
【数据规模和约定】
20%: 小数据
100%的数据中N<=100000,K<=109。
因为后面的不会对前面产生影响 所以顺序处理就行了
如果pos为偶数,那么a[i]=a[i+1]下一次就得从pos-1开始
反之从pos开始
对于过大的p我们可以发现:
1.当pos=n-1时,无论怎样都不能,直接退出
2.当出现循环时,将k取膜
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,pos,x,vis[];
char s[];
int main()
{
//freopen("lucky.in","r",stdin);
//freopen("lucky.out","w",stdout);
cin>>n>>k;
cin>>s;
pos=;x=;
while (k--)
{
while (pos<n-&&!(s[pos]==''&&s[pos+]==''))
pos++;
if (pos==n-) break;
if (vis[pos]==) vis[pos]=x;
else
{
k%=(x-vis[pos]);
}
if (pos%==) s[pos+]=s[pos];
else
{
s[pos]=s[pos+];
pos=pos-;
}
x++;
}
cout<<s;
}