jzoj 5392(规律)

结论1:奇数位开始的233和223可互换,所以判断奇偶性即可
结论2:23 是独立的。也就是说我们直接顺序扫23,退两格修改即可

然后扫描一遍即可

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define db double
#define FN2 "trans"
int n, k;
char s[1000000 + 5];
void clean() {
}
void solve() {
    clean();
    scanf("%s", s + 1);
    for (int i = 1; i <= n && k; i++) {
        if (i < 1) i = 1;
        if (s[i] == '2' && s[i + 1] == '3' && s[i + 2] == '3' && i % 2 == 1) k %= 2;
        if (k && s[i] == '2' && s[i + 1] == '3') s[i] = s[i + 1] = ((i % 2 == 1) ? '2' : '3'), i -= 2, k--; 
    }
    printf("%s\n", s + 1);
}
int main() {
    freopen(FN2".in", "r", stdin);freopen(FN2".out", "w", stdout);
    while (scanf("%d%d", &n, &k) == 2) solve();
    fclose(stdin), fclose(stdout);
    return 0;
}

题目描述

Tgopknight决定使用他的幸运数字2和3来进行这个游戏,他一开始有$n$个数字,记为${dn}$,
需要进行k次操作,每次操作找到最小的$x$使得$d_x = 2$ 并且$d_{x+1}= 3$,此时如果$x$为奇数,则令$d_{x+1}= 2$,反之令$d_x= 3$,若没有这样的$c$,则数字不变。
Tgopknight现在想知道进行完所有操作后这些数字变成了什么。

本题有多组数据。
每组数据第一行是两个正整数n 和k,分别表示数字个数和操作次数。
第二行有n个数字,数字之间没有空格。
Sample Input
7 2
2343223
4 1
2234

对于每组数据,输出一行,为操作进行完之后的结果。
Sample Output
2243233
2334

对于前50% 的数据$n \leq 10^4,k \leq 10^4$
对于前70% 的数据$k \leq 10^6$
对于100% 的数据$1 \leq n \leq 10^6,0 \leq k \leq 10^9$
数据组数不超过$10$

第一组数据,2343223 - 2243223 - 2243233
第二组数据,2234 - 2334

------ 本文结束 ------