P7750 [COCI2013-2014#2] SLOM 题解

思路:

首先我们观察本题的几个样例。

我们拿第三个样例为例来模拟一下这个过程。

开始时:srama

第一次:sarma

第二次:saamr

第三次:srama

这是我们发现经过三次变化就变成了开始时的样子,所以我们可以得出结论:变换序列是存在循环的!

经过多次尝试,我们发现,字符串长度为 5,循环次数为 3,但是如果字符串长度为 6,循环次数为 4,而当字符串长度为 8,循环次数为 4……

于是我们得出结论:字符串长度与单词循环次数没有直接关系!

此时我们可以考虑通过代码暴力算出对于长度为 n 的单词单次循环次数。

这样我们就可以得到一个长度为 n 的单词单词循环次数 x,那么我们就可以用 X(题目中的眨眼次数)对 x 取模,其值为 dx,则我们只需要模拟 dx 次即可(即循环 dx 次)。

代码:

#include<bits/stdc++.h>

using namespace std;

string st;
int x, x1, dx;
vector<int> v;

bool check(int t) {
    if (t == 0) return 0;
    for (int i = 0; i < v.size(); ++i) {
        if (v[i] != i + 1) return 0;
    }
    return 1;
}

int solve(int n) {
    v.clear();
    int i;
    for (i = 1; i <= n; i++) v.push_back(i);
    for (i = 0;; i++) {
        if (check(i)) break;
        for (int j = 0; j<v.size() >> 1; ++j) {
            int tmp = v.back();
            v.pop_back();
            v.insert(v.begin() + (j << 1 | 1), tmp);
        }
    }
    return i;
}

int main() {
    scanf("%d", &x);
    cin >> st;
    x1 = solve(st.size());
    dx = x % x1;
    for (int i = 0; i < x1 - dx; ++i) {
        for (int j = 0; j<st.size() >> 1; ++j) {
            string tmp = "";
            tmp += (char)st[st.size() - 1];
            st.erase(st.size() - 1, 1);
            st.insert(j << 1 | 1, tmp);
        }
    }
    cout << st;
    return 0;
}
 
posted @ 2022-11-16 20:06  Simba秋  阅读(53)  评论(0)    收藏  举报