小模拟一道,这题我是直接硬搞的,擦在快TLE的边缘过了,小偷了个懒。。正确做法应该是找出循环的规律再求解,因为如果s很大的话直接循环s次求解是必挂的。。另外字符只有a和b两种情况,因此可以优化成bool数组,节省不少空间
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<deque>
using namespace std;
namespace
{
int number(bool b1, bool b2, bool b3)
{
int res = b1;
res = res * 2 + b2;
return res * 2 + b3;
}
bool compare(const deque<bool> &q1, const deque<bool> &q2)
{
for (size_t i = 0; i < q1.size(); i++)
if (q1[i] != q2[i])
return q1[i];
return false;
}
deque<bool> maxq(deque<bool> &q)
{
deque<bool> res = q;
int count = q.size() - 1;
while (count--)
{
bool head = q.front();
q.pop_front();
q.push_back(head);
if (compare(q, res))
res = q;
}
return res;
}
}
int main()
{
int n, m;
string s, rule;
bool map[8], src[16], temp[16];
deque<bool> Q;
while (cin >> n)
{
cin >> s;
for (int i = 0; i < n; i++)
src[i] = s[i] == 'a';
for (int i = 0; i < 8; i++)
{
cin >> rule;
map[number(rule[0] == 'a', rule[1] == 'a', rule[2] == 'a')] =
rule[3] == 'a';
}
int left, right;
cin >> m;
while (m--)
{
for (int i = 0; i < n; i++)
{
left = (i + n - 2) % n;
right = (i + 1) % n;
temp[i] = map[number(src[left], src[i], src[right])];
}
memcpy(src, temp, sizeof(temp));
}
Q.clear();
for (int i = 0; i < n; i++)
Q.push_back(src[i]);
Q = maxq(Q);
for (size_t i = 0; i < Q.size(); i++)
cout << (Q[i] ? 'a' : 'b');
cout << endl;
}
return 0;
}