sgu271:Book Pile(reverse大法好)

来源:互联网 发布:弱矩阵 编辑:程序博客网 时间:2024/06/16 07:10

题目大意:
      给出一摞书,有n本,有两种操作,要求输出最后的树的排列:
      1.在顶端加上一本书;
      2.翻转最上面的k本书,如果当前书本数少于k,则全部翻转。

分析:
      偷懒了直接用reverse加点优化过了(不得不说reverse常数巨大,然而这是偷懒的代价...)

AC code:

#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <cctype>#include <algorithm>#include <string>#include <sstream>#include <iostream>#include <map>#include <set>#include <list>#include <stack>#include <queue>#include <vector>#define pb push_back#define mp make_pairtypedef long long LL;typedef double DB;typedef long double LD;using namespace std;const int MAXN = 40009;const int MAXM = 100009;const int MAXK = 40009;const int SIGMA = 27;int n, m, k;int seq[MAXN+MAXM];int id[SIGMA][SIGMA][SIGMA], tot;char name[SIGMA*SIGMA*SIGMA][5];int main(){    #ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);    #endif    char str[10] = "\0";    scanf("%d%d%d\n", &n, &m, &k);    for(int i = n; i >= 1; --i)    {        gets(str);        int need[5] = {0};        need[0] = str[0]-'A'+1;        if(str[2] >= 'A' && str[2] <= 'Z') need[2] = str[2]-'A'+1;        if(str[1] >= 'A' && str[1] <= 'Z') need[1] = str[1]-'A'+1;        if(!id[need[0]][need[1]][need[2]])        {            id[need[0]][need[1]][need[2]] = ++tot;            strcpy(name[tot], str);         }        seq[i] = id[need[0]][need[1]][need[2]];    }    bool tmp = false;    while(m--)    {        char need[5] = "\0";        gets(str);        if(str[0] == 'A')        {            if(tmp)            {                if(n < k) reverse(seq+1, seq+n+1);                else reverse(seq+n-k+1, seq+n+1);            }            tmp = false;            int t[5] = {0};            t[0] = str[4]-'A'+1;            need[0] = str[4];            if(str[5] != ')')            {                t[1] = str[5]-'A'+1;                need[1] = str[5];                if(str[6] != ')')                {                    t[2] = str[6]-'A'+1;                    need[2] = str[6];                }            }            if(!id[t[0]][t[1]][t[2]])            {                id[t[0]][t[1]][t[2]] = ++tot;                strcpy(name[tot], need);            }            seq[++n] = id[t[0]][t[1]][t[2]];        }        else tmp ^= true;       }    if(tmp)    {        if(n < k) reverse(seq+1, seq+n+1);        else reverse(seq+n-k+1, seq+n+1);    }    for(int i = n; i >= 1; --i)        puts(name[seq[i]]);    #ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);    #endif    return 0;}
0 0
原创粉丝点击