T3题解:
100分(总分200):
根据数据范围可以知道,100%的数据撤销操作不会撤掉之前的撤销操作。
所以撤销操作能撤掉的只有插入操作。而插入操作每次都是在最末尾,所以每次把后X个字母删掉就可以了。
180分:
设a[i]表示第i次出现的结果,每产生一个新的结果后,就把i的值增加1,把新出现的结果放到a[i]中。
从数据得知,UNDO操作是可以撤掉UNDO操作的。所以我们不能直接删字母。
因为UNDO是最后X次操作,所以如果遇到UNDO就把a[i]赋值为a[i-x-1]。
200分:
180分的方法会空间超限,所以我们要把空间压缩。
先普及一个知识:
在PASCAL中,string是字符数组,但ansistring是字符链表。
数组和链表的区别就在于一个数组的空间是固定的,但链表的空间和长度却是成正比。
在计算过程中会产生很多已经没有价值的字符链表,即不影响到最终结果,我们可以根据上面的性质把他们释放(即赋值为空)从而节省空间。
所以我们可以把距离当前第i个节点较远的节点删除,就可以AC了。