URAL 1992
题目值得一做
解析:
通过两个线性表来实现前进后退操作。
#include <cstdio> #include <iostream> #define N 500005 using namespace std; int now[N],tot_ro,c,p; int stack[N],pre[N],tot; int stack_ne[N],now_ne[N],next[N],tot_ne; char order[100]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){ tot=tot_ne=0; tot_ro=1; now[1]=now_ne[1]=0; for(int i=0; i<n; i++){ scanf("%s",order); switch (order[4]) { case 'n'://learn scanf("%d%d",&c,&p); stack[++tot]=p; pre[tot]=now[c]; now[c]=tot; now_ne[c]=0; break; case 'b'://rollback scanf("%d",&c); if(now[c]!=0){ stack_ne[++tot_ne]=stack[now[c]]; next[tot_ne]=now_ne[c]; now_ne[c]=tot_ne; now[c]=pre[now[c]]; } break; case 'a'://relearn scanf("%d",&c); if(now_ne[c]!=0){ stack[++tot]=stack_ne[now_ne[c]]; pre[tot]=now[c]; now[c]=tot; now_ne[c]=next[now_ne[c]]; } break; case 'e'://clone scanf("%d",&c); if(c<=tot_ro){ now[++tot_ro]=now[c]; now_ne[tot_ro]=now_ne[c]; } break; case 'k'://check scanf("%d",&c); if(now[c]==0) printf("basic\n"); else printf("%d\n",stack[now[c]]); break; } } } return 0; }
那么多的束缚,我不曾放弃过;那么多的险阻,我不曾倒下过。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步