幸运序列(lucky)
【问题描述】
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取膜
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,k,pos,x,vis[100001]; 7 char s[1000001]; 8 int main() 9 { 10 //freopen("lucky.in","r",stdin); 11 //freopen("lucky.out","w",stdout); 12 cin>>n>>k; 13 cin>>s; 14 pos=0;x=1; 15 while (k--) 16 { 17 while (pos<n-1&&!(s[pos]=='4'&&s[pos+1]=='7')) 18 pos++; 19 if (pos==n-1) break; 20 if (vis[pos]==0) vis[pos]=x; 21 else 22 { 23 k%=(x-vis[pos]); 24 } 25 if (pos%2==0) s[pos+1]=s[pos]; 26 else 27 { 28 s[pos]=s[pos+1]; 29 pos=pos-1; 30 } 31 x++; 32 } 33 cout<<s; 34 }