模拟题。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
const int maxn=1e2+6;
typedef long long ll;
int st[maxn], st_cp[maxn]; // st存煎饼,st_cp存放正确的煎饼顺序
char str[maxn]; // str用于输入
queue<int> ans; // ans记录正确的翻转顺序
int transfer(char str[]) // 将输入的str转为整数存进st, st_cp
{
int len = strlen(str), cnt = 0;
str[len] = ' ';
stack<char> stk; // 借助了栈,方便操作
for(int i=0; i<=len; ++i)
{
if(str[i] == ' ')
{
if(!stk.empty())
{
int tmp = 1, num = 0;
while(!stk.empty())
{
num += tmp * (stk.top() - '0');
tmp *= 10;
stk.pop();
}
st[cnt] = num;
st_cp[cnt++] = num;
}
}
else
stk.push(str[i]);
}
return cnt;
}
int get_pos(int l, int r, int tar)
{
for(int i=l; i<=r; ++i)
if(st[i] == tar)
return i;
}
void _reverse(int pos, int cnt)
{
stack<int> stk;
for(int i=0; i<=pos; ++i)
stk.push(st[i]);
for(int i=0; i<=pos; ++i)
{
st[i] = stk.top();
stk.pop();
}
ans.push(cnt-pos);
}
void reverse(int cur, int cnt) // 逆转st[0, cur]的子序列,cnt为st的长度
{
int pos = get_pos(0, cur, st_cp[cur]);
if(pos)
_reverse(pos, cnt);
pos = cur;
_reverse(pos, cnt);
}
int main()
{
while(gets(str))
{
int cnt = transfer(str);
sort(st_cp, st_cp+cnt);
for(int i=0; i<cnt; ++i) //记得先输出整个煎饼序列,因为这个WA了一次
{
printf("%d", st[i]);
if(i+1 != cnt)
putchar(' ');
else
putchar('\n');
}
for(int i=cnt-1; i>=0; --i)
{
if(st[i] == st_cp[i])
continue;
reverse(i, cnt);
}
ans.push(0);
while(!ans.empty())
{
int pos = ans.front();
ans.pop();
printf("%d", pos);
if(!ans.empty())
putchar(' ');
}
putchar('\n');
}
return 0;
}