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;
}
本文来自博客园,作者:Simba秋,转载请注明原文链接:https://www.cnblogs.com/yangzichen/p/16897362.html

浙公网安备 33010602011771号