1. 程式人生 > >[AHOI2006] 文本編輯器editor

[AHOI2006] 文本編輯器editor

ram turn edi fin out ons blog read www

Description
這些日子,可可不和卡卡一起玩了,原來可可正廢寢忘食的想做一個簡單而高效的文本編輯器。你能幫助他嗎?為了明確任務目標,可可對“文本編輯器”做了一個抽象的定義:
技術分享圖片
技術分享圖片
文本:由0個或多個字符構成的序列。這些字符的ASCII碼在閉區間[32, 126]內,也就是說,這些字符均為可見字符或空格。
光標:在一段文本中用於指示位置的標記,可以位於文本的第一個字符之前,文本的最後一個字符之後或文本的某兩個相鄰字符之間。
文本編輯器:為一個可以對一段文本和該文本中的一個光標進行如下七條操作的程序。如果這段文本為空,我們就說這個文本編輯器是空的。
編寫一個程序:? 建立一個空的文本編輯器。? 從輸入文件中讀入一些操作指令並執行。? 對所有執行過的GET操作,將指定的內容寫入輸出文件。

Input
輸入文件中第一行是指令條數N,以下是需要執行的N個操作。除了回車符之外,輸入文件的所有字符的ASCII碼都在閉區間[32, 126]內。且行尾沒有空格。

Output
依次對應輸入文件中每條GET指令的輸出,不得有任何多余的字符。

Sample Input
10
Insert 13
Balanced eert
Move 2
Delete 5
Next
Insert 7
editor
Move 0
Get
Move 11
Rotate 4
Get

Sample Output
B
t

HINT
對輸入數據我們有如下假定:? MOVE操作不超過50 000個,INSERT、DELETE和ROTATE操作作的總個數不超過6 000,GET操作不超過20 000個,PREV和NEXT操作的總個數不超過20 000。? 所有INSERT插入的字符數之和不超過2M(1M=1 024*1 024)。? DELETE操作、ROTATE操作和GET操作執行時光標後必然有足夠的字符。MOVE、PREV、NEXT操作不會把光標移動到非法位置。? 輸入文件沒有錯誤。

首先我們需要寫出一道前置題[NOI2003]Editor,然後這題牽涉到翻轉子串,那樣我們開兩個rope,一個正的,一個反的,然後翻轉就成了交換子串了,對吧?

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<ext/rope>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
using namespace __gnu_cxx;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<1)+(x<<3)+ch-'0';
    return x*f;
}
inline void print(int x){
    if (x>=10)  print(x/10);
    putchar(x%10+'0');
}
crope rop1,rop2;
const int N=2.1e6;
char s[N+10],t[N+10],type[10];
int main(){
    int n=read(),pos=0;
    for (int i=1;i<=n;i++){
        scanf("%s",type);
        if (type[0]=='M')   pos=read();
        if (type[0]=='I'){
            int x=read(),len=rop1.length();
            for (int i=0;i<x;i++){
                s[i]=getchar();
                while (s[i]=='\n'||s[i]=='\r')  s[i]=getchar();
            }
            s[x]=0;
            rop1.insert(pos,s);
            reverse(s,s+x);
            rop2.insert(len-pos,s);
        }
        if (type[0]=='D'){
            int x=read(),len=rop1.length();
            rop1.erase(pos,x);
            rop2.erase(len-pos-x,x);
        }
        if (type[0]=='R'){
            int x=read(),len=rop1.length();
            rop1.copy(pos,x,s);
            rop2.copy(len-pos-x,x,t);
            s[x]=t[x]=0;
            rop1.replace(pos,x,t);
            rop2.replace(len-pos-x,x,s);
        }
        if (type[0]=='G')   printf("%c\n",rop1.at(pos));
        if (type[0]=='P')   pos--;
        if (type[0]=='N')   pos++;
    }
    return 0;
}

[AHOI2006] 文本編輯器editor