文字編輯器 Editor

2021-07-28 21:22:29 字數 4095 閱讀 2460

題意描述

九發明了乙個完美的文字編輯器。這個編輯器擁有兩個游標(cursor),所以九能夠同時在兩處地方插入和刪除文字。這個編輯器除了正常的編輯功能以外,還有一些只有九才知道用處的功能,例如翻轉兩個游標之間的文字。某一天,九把自己的完美文字編輯器給弄丟了,但是她還有好多好多文字需要處理。於是她想請聰明又智慧型的你幫她實現完美文字編輯器的一些功能。

功能列表如下:

功能名稱

命令格式

說明<

(move left)

<

ww 為乙個字元,「l」或「r」,表示左游標還是右游標(下同)。該命令將選定游標向左移動,如果已經是最左端則不移動。命令執行成功時輸出「t」,若游標已經在最左端,則輸出「f」。

>

(move right)

>

ww 同上。與< 命令不同的是,該命令將游標向右移動。命令執行成功時輸出「t」,若游標已經在最右端,則輸出「f」。

i (insert)

i w c

w 同上。c 是乙個可見字元(33≤ ascii 碼 ≤ 126),代表在該游標左側插入該字元。該命令始終輸出「t」。

d (delete)

d ww 同上。代表刪除該游標右側的乙個字元。命令執行成功時輸出「t」,若游標右側沒有字元輸出「f」。

r (reverse)

r代表翻轉左游標和右游標之間的字元。該命令只有左游標在右游標左側時才能執行。(兩游標重合時也不能執行)命令執行成功時輸出「t」,否則輸「f」。

s (show)

s代表顯示當前處理的文字。該命令只輸出文字,不輸出「t」和「f」。

開始時文字編輯器中有一定內容,左游標在第乙個字元左,右游標在最後乙個字元右。

注意:在插入和刪除操作中,沒有被操作的游標與文字的相對左右位置保持不變。特別地,若兩個游標重疊,操作後也仍然重疊。

輸入格式

第一行是初始時文字編輯器內容。

第二行是乙個正整數 n,n 表示操作次數。

接下來有 n 行,每行有乙個命令,命令格式如上方**。

輸出格式

對於每個命令,按上方**要求執行並輸出。

樣例輸入

goodykc

11 i r u

i r l

>

l >

l >

l >

l r

d r

<

r d r

s

樣例輸出

t

t t

t t

t t

f t

t goodluck

樣例解釋

[goodykc]

[goodykcu]

[goodykcul]

g[oodykcul]

go[odykcul]

goo[dykcul]

good[ykcul]

good[lucky]

good[lucky](游標右邊沒有字元,失敗刪除)

good[luck]y

good[luck]

goodluck

資料規模與約定

這道題最後3個點難度很大,但是前7個點應該是非常容易通過的,然而我只過了三個,乙個原因是對這種**量大的題速度跟不上,還有寫鍊錶的時候沒有將頭指標的pre賦為-1,以後寫鍊錶的時候一定要注意。

後面3個點的解法還沒看懂,以後再說

更新:其實就是個平衡樹區間翻轉,現在感覺當時的我好 zz 啊

70分**

#include

#include

#include

using

namespace

std;

const

int maxl=1e5;

int n;

char s[maxl+10];

int len;

int tcnt;

struct t text[maxl*11+10];

void del(int x)

void add(int x,char c)

struct c

void move(bool l)

else pri(false);

}else

if(text[pos].next)

else pri(false);

}void insert(char c)

void rm()

else pri(false);

}} l,r;

int main()

else

if(c=='i')

else

}else

if(c=='d')

else

if(c=='s')

}return

0;}

100分標程

#include 

#include

#include

#include

using

namespace

std;

#define n 10000000

int pre[n], suf[n];

char ch[n], st[n];

int idx, pos[2], cnt[2];

inline

void swap(int &a, int &b)

void insert(int opt, char c)

void lmove(int opt)

int u = pos[opt], v = pre[u];

if (suf[v] != u) swap(suf[v], pre[v]);

pos[opt] = v; cnt[opt]--;

puts("t");

} void rmove(int opt)

int u = suf[pos[opt]], v = suf[u];

if (pre[v] != u) swap(suf[v], pre[v]);

pos[opt] = u; cnt[opt]++;

puts("t");

}void delete(int opt)

int u = pos[opt], v = suf[u], w = suf[v];

if (pre[w] != v) swap(suf[w], pre[w]);

if (cnt[opt^1] > cnt[opt]) cnt[opt^1]--;

if (pos[opt^1] == v) pos[opt^1] = u;

suf[u] = w; pre[w] = u;

puts("t");

}void reverse()

if (cnt[1] - cnt[0] == 1)

int a = pos[0], b = suf[a], c = pos[1], d = suf[c];

swap(pre[b], suf[b]); swap(pre[c], suf[c]);

suf[a] = c; pre[c] = a; suf[b] = d; pre[d] = b;

pos[1] = b;

puts("t");

}void show()

putchar('\n');

}void build()

if (len > 0)

}inline

int dir()

int main()

else

if (opt == 'd') delete(dir());

else

if (opt == 'r') reverse();

else

if (opt == 's') show();

}return

0;}

AHOI2006 文字編輯器editor

description 這些日子,可可不和卡卡一起玩了,原來可可正廢寢忘食的想做乙個簡單而高效的文字編輯器。你能幫助他嗎?為了明確任務目標,可可對 文字編輯器 做了乙個抽象的定義 文字 由0個或多個字元構成的序列。這些字元的ascii碼在閉區間 32,126 內,也就是說,這些字元均為可見字元或空格...

文字編輯器

include stdio.h include string.h include stdlib.h define len sizeof struct linetable struct linetable main 輸出並加入行號 display struct linetable head else ...

文字編輯器

text editer文字編輯器 data ref container tec type ref to cl gui custom container.data ref edit type ref to cl gui textedit.data text line 85 work area it t...