URAL 1992 CVS 可持久化链栈

http://www.cnblogs.com/tedzhao/archive/2008/11/12/1332112.html

看这篇的链表部分的介绍应该就能理解“可持久化”了

动态分配内存的会T,只能用静态

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;

struct node {
    int p;
    int next;
};
const int maxn = 500005;
node nd[maxn * 2];
int ha[maxn], hb[maxn];
int c;
int cnt;
void add(int &head, int p) {
    nd[cnt].p = p;
    nd[cnt].next = head;
    head = cnt++;
}
int main() {
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF) {
        c = 1;
        cnt = 0;
        ha[c] = -1; hb[c] = -1;
        for(int i = 1; i <= n; i++) {
            char op[20]; scanf("%s", op);
            if(strcmp(op, "learn") == 0) {
                int id, p;
                scanf("%d%d", &id, &p);
                add(ha[id], p);
                hb[id] = -1;
            } else if(strcmp(op, "rollback") == 0) {
                int id;
                scanf("%d", &id);
                add(hb[id], nd[ha[id]].p);
                ha[id] = nd[ha[id]].next;
            } else if(strcmp(op, "clone") == 0) {
                int id;
                scanf("%d", &id);
                c++;
                ha[c] = ha[id];
                hb[c] = hb[id];
            } else if(strcmp(op, "check") == 0) {
                int id;
                scanf("%d", &id);
                if(ha[id] == -1) {
                    printf("basic
");
                } else printf("%d
", nd[ha[id]].p);
            } else if(strcmp(op, "relearn") == 0) {
                int id;
                scanf("%d", &id);
                add(ha[id], nd[hb[id]].p);
                hb[id] = nd[hb[id]].next;
            }
        }
        return 0;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/BMan/p/3874867.html