jzoj5249 【NOIP2017提高A組模擬8.10】文字編輯器 (序列修改類問題,資料結構)
題面
分析
splay的話是過不了最後一個點的。
顯而易見的我們可以考慮連結串列+tag,但是細節很多。
因為翻轉只翻轉兩個游標中間的地方,我們考慮將中間的放到一個佇列裡,然後左右兩邊分別開一個棧存。 (佇列左右兩邊各留下n的空位以供插入)
翻轉的話就調換一下佇列的head與tail,並且將正方向取反。
+正方向就相當於在序列上的後一個位置。
想一想,這樣設計的話別的操作不需要特殊考慮,和沒翻轉的情況一樣做就行。
還需要考慮l,r游標反過來的情況。但資料裡沒有所以沒打
怎麼考慮呢?
假如當l=r時l右移或r左移,我們就交換l,r游標,並標記錯位。這樣的話後面l左移就相當於r左移,與一般的情況是等價的。錯位的時候不能進行R操作。什麼時候l=r了就將錯位標記去掉。
兩個套起來想有點複雜,需要好好思考。
單獨維護游標區間,也是一些編輯器問題的套路。
Code
(不包括l,r錯位的情況)
#include <cstdio>
#include <iostream>
#include <cstring>
#define getf(x) ((x=='L')?0:1)
const int N=4*1e6+10;
using namespace std;
char s[N],op;
int tot,root,len;
int top0,top1,L,R,tag;
char q[N*4],S[2][N];
int n,f[2],dir;
void show() {
for (int i=1; i<=top0; i++) putchar(S[0][i]);
for (int i=L; i!=R; i+=dir) putchar(q[i]);
putchar(q[R]);
for (int i=top1; i; i--) putchar(S[1][i]);
putchar('\n');
}
int readf() {char wf; scanf("%c",&wf); return getf(wf);}
int main() {
freopen("33.in","r",stdin);
freopen("33.out","w",stdout);
scanf("%s\n%d",s+1,&n);
int len=strlen(s+1);
f[0]=0,f[1]=len;
L=R=n+1; for (int i=1; i<=len; i++) q[R++]=s[i];
--R; dir=1;
// show();
int w;
for (int i=1; i<=n; i++) {
scanf("\n%c ",&op);
if (op!='R' && op!='S') w=readf();
if (op=='>') {
printf("%c\n",(f[w]==len)?'F':'T');
if (f[w]<len) {
++f[w];
if (w==0) S[0][++top0]=q[L],L+=dir;
else q[R+=dir]=S[1][top1--];
}
} else
if (op=='<') {
printf("%c\n",(f[w]==0)?'F':'T');
if (f[w]>0) {
--f[w];
if (w==0) q[L-=dir]=S[0][top0--];
else S[1][++top1]=q[R],R-=dir;
}
} else
if (op=='I') {
char ne; scanf(" %c",&ne);
if (w==0) S[0][++top0]=ne; else
q[R+=dir]=ne;
printf("T\n");
if (w==0) {
if (f[1]>=f[0]) ++f[1];
++f[0];
} else {
if (f[0]>=f[1]) ++f[0];
++f[1];
}
++len;
} else
if (op=='D') {
if (f[w]==len) {
printf("F\n"); continue;
} else printf("T\n");
if (w==0) L+=dir; else
top1--;
if (w==0) {
if (f[1]>f[0]) --f[1];
} else {
if (f[0]>f[1]) --f[0];
}
--len;
} else
if (op=='R') {
if (tag) {
printf("F\n"); continue;
} else printf("T\n");
swap(L,R); dir=-dir;
} else
if (op=='S') show(),printf("\n");
// printf("\n%d ",i);
// show();
// printf("\n");
}
}
相關文章
- 2020.10.31【NOIP提高A組】模擬總結
- ProseMirror - 模組化的富文字編輯框架ROS框架
- BF的資料結構題單-提高組——樹鏈剖分資料結構
- fastmock模擬常見資料結構ASTMock資料結構
- Canvas圖形編輯器-資料結構與History(undo/redo)Canvas資料結構
- Slate文件編輯器-WrapNode資料結構與操作變換資料結構
- 如何在模板中編輯修改文字
- 增強 Vim 編輯器,提高編輯效率
- P3959 [NOIP2017 提高組] 寶藏
- FSNotes for Mac(文字編輯器)Mac
- Typora for Mac(文字編輯器)Mac
- Linux文字編輯器JedLinux
- 【比賽】CSP提高組模擬1
- android 模擬器 記憶體修改, 用winshark 抓包,修改資料包Android記憶體
- 演算法與資料結構 1 - 模擬演算法資料結構
- CCF-NOIP-2018 提高組(複賽) 模擬試題(一)
- CCF-NOIP-2018 提高組(複賽) 模擬試題(三)
- 編輯器快速列印html模板結構HTML
- 富文字編輯器:UEditor與wangEditor 初使用總結
- Python原生資料結構增強模組collectionsPython資料結構
- Markdown文字編輯器:Typora for MacMac
- SpringMVC整合富文字編輯器SpringMVC
- Typora for Mac - Markdown文字編輯器Mac
- Versatil Markdown for Mac文字編輯器Mac
- Typora for Mac(Markdown文字編輯器)Mac
- QT 多文件文字編輯器QT
- Jzoj5459【NOIP2017提高A組衝刺11.7】密室
- 資料結構與演算法之硬幣組合問題資料結構演算法
- Android studio虛擬模擬器安裝問題Android
- BF的資料結構題單-提高組 ——P1197 [JSOI2008]星球大戰資料結構JS
- 資料結構括號匹配問題資料結構
- 03.Java資料結構問題Java資料結構
- 資料結構——RMQ(ST表)問題資料結構MQ
- 【資料結構】停車場問題資料結構
- 【前端】vue引入tinymce富文字編輯器上傳影片自動轉img問題前端Vue
- _001_IDEA_修改編輯器的編碼Idea
- drozer模組的編寫及模組動態載入問題研究
- 分享 - 富文字編輯器 Froala Editor
- SSM使用UEditor富文字編輯器SSM