NOI2003 文字編輯器

2022-02-27 07:43:38 字數 2700 閱讀 7074

很久很久以前, dos3.xdos3.xdos3.x 的程式設計師們開始對 edlinedlinedlin 感到厭倦。於是,人們開始紛紛改用自己寫的文字編輯器⋯⋯

多年之後,出於偶然的機會,小明找到了當時的乙個編輯軟體。進行了一些簡單的測試後,小明驚奇地發現:那個軟體每秒能夠進行上萬次編輯操作(當然,你不能手工進行這樣的測試) !於是,小明廢寢忘食地想做乙個同樣的東西出來。你能幫助他嗎?

為了明確目標,小明對「文字編輯器」做了乙個抽象的定義:

文字:由 000 個或多個 ascii 碼在閉區間[ 323232 , 126126126 ]內的字元構成的序列。

游標:在一段文字中用於指示位置的標記,可以位於文字首部,文字尾部或文字的某兩個字元之間。

操作名稱

輸入檔案中的格式功能

move(k)

move k

將游標移動到第 k個字元之後,如果 k=0,將游標移到文字開頭

insert(n,s)

insert n s

在游標處插入長度為n的字串s,游標位置不變n≥1

delete(n)

delete n

刪除游標後的n個字元,游標位置不變,n ≥ 1

get(n)

get n

輸出游標後的n個字元,游標位置不變,n ≥ 1

prev()

prev

游標前移乙個字元

next()

next

游標後移乙個字元

你的任務是:

輸入格式:

輸入檔案 editor.in 的第一行是指令條數 t,以下是需要執行的 t 個操作。其中:

為了使輸入檔案便於閱讀, insert 操作的字串中可能會插入一些回車符, 請忽略掉它們(如果難以理解這句話,可以參照樣例) 。

除了回車符之外,輸入檔案的所有字元的 ascii 碼都在閉區間[32, 126]內。且

行尾沒有空格。

這裡我們有如下假定:

prev 和 next 操作的總個數不超過 200000。

操作必然不會試圖把游標移動到非法位置。

輸出格式:

輸出檔案 editor.out 的每行依次對應輸入檔案中每條 get 指令的輸出。

輸入樣例#1:

15insert 26

abcdefghijklmnop

qrstuv wxy

move 15

delete 11

move 5

insert 1

^next

insert 1

_next

next

insert 4

./.get 4

prev

insert 1

^move 0

get 22

輸出樣例#1:

abcde^_^f.\/.ghijklmno

題意是模擬,就不多扯了

題解:顯然是一道資料結構題,考慮用平衡樹來維護.這裡我用的是無旋treap.如果不知道如何實現無旋treap請戳這裡講一下怎麼處理這幾個操作(用pos表示游標位置).

所以這裡比較麻煩的就是如何在插入之前先建好一顆treap再插入了.

其實這裡可以用乙個棧來實現,用棧頂記錄已經插入的元素中的最右下的那乙個,然後每次多加入乙個元素就判斷是否將這個元素旋上去,最後棧的第一位就是合併出的樹根了.

#include#define ls t[x].ch[0]

#define rs t[x].ch[1]

#define debug out(root), printf("\n")

using namespace std;

const int n=2050000;

int n, cnt = 0, root = 0, r1, r2, r3;

int pos = 0, stk[n], top = 1;

char s[n];

struct treapt[n];

int gi()

while(i>='0'&&i<='9')

return ans * f;

}void out(int x)

void up(int x)

int newnode(int val)

void split(int x, int k, int &a, int &b)

if(k <= t[ls].size) b = x, split(ls, k, a, ls);

else a = x, split(rs, k-t[ls].size-1, rs, b); up(x);

}int merge(int x, int y) else

}int build(int len)

while(top) up(stk[top--]); return stk[1];

}void insert(int len)

top = 0; int r2 = build(len);

root = merge(r1, merge(r2, r3));

}void delet(int len)

void get(int len)

int main()

return 0;

}

NOI2003 文字編輯器

題目 發現這樣一句話就會導致 t ch m 0 m 並不是很知道為什麼,可能這是某種未定義行為在不同編譯器下會有不同後果?至於這道題就很簡單了,幾個有關游標位置的操作就用乙個變數模擬就好了 插入的話把這個位置轉出來構造一棵完美 splay 插入就好了 刪除直接轉出區間斷開的父親的鏈結 輸出直接轉出區...

cogs 330 NOI2003 文字編輯器

輸入檔案 editor2003.in輸出檔案 editor2003.out簡單對比 時間限制 2 s 記憶體限制 128 mb 問題描述 很久很久以前,dos3.x的程式設計師們開始對edlin感到厭倦。於是,人們開始紛紛改用自己寫的文字編輯器 多年之後,出於偶然的機會,小明找到了當時的乙個編輯軟體...

題解 P4008 NOI2003 文字編輯器

link 在 insert 操作中可能存在換行符,你需要忽略掉它們,但是保證所有的字元的 ascii 碼在 32 126 內。保證 insert 操作插入的總長度不超過 2 個。保證游標不會移到非法位置,保證刪除,查詢的字元存在。發現有區間插入,區間刪除,考慮用 splay 維護。用乙個變數維護當前...