记录编号 |
376298 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2003]文本编辑器 |
最终得分 |
100 |
用户昵称 |
KZNS |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.625 s |
提交时间 |
2017-02-26 23:21:06 |
内存使用 |
0.31 MiB |
显示代码纯文本
- //KZNS
- #include <cstdio>
- #include <list>
- #include <memory.h>
- using namespace std;
- #define Bsize 5000
- class block { public:
- int len;
- char s[Bsize];
- block() {
- len = 0;
- }
- };
- typedef list<block>::iterator CIT;
- class editor { public:
- list<block> ls;
- list<block>::iterator cit;
- int clk, clen;
- editor() {
- ls.push_front(block());
- cit = ls.begin();
- clk = 0;
- clen = 0;
- }
- void Split(CIT it, int lk) {
- if (lk == it->len)
- return;
- else {
- block u;
- u.len = it->len - lk;
- memcpy(u.s, it->s+lk, u.len);
- it->len = lk;
- ls.insert(++it, u);
- }
- }
- void Move(int a) {
- clen = a;
- for (CIT i = ls.begin(); i != ls.end(); i++) {
- if (a <= i->len) {
- cit = i;
- clk = a;
- break;
- }
- else {
- a -= i->len;
- }
- }
- }
- void Insert(int n) {
- Split(cit, clk);
- CIT u;
- char c;
- u = cit;
- CIT uu;
- for (int i = 0; i < n; i++) {
- do {
- c = getchar();
- } while (c < 32 || c > 126);
- if (u->len == Bsize) {
- uu = u;
- ls.insert(++u, block());
- u = ++uu;
- }
- u->s[u->len++] = c;
- }
- }
- void Delete(int n) {
- Split(cit, clk);
- CIT it = cit;
- for (it++; it != ls.end(); it++) {
- if (it->len < n) {
- n -= it->len;
- }
- else {
- Split(it, n);
- break;
- }
- }
- CIT bbb = cit;
- ls.erase(++bbb, ++it);
- }
- void Get(int n) {
- CIT it = cit;
- for (int i = clk; n && i < it->len; i++) {
- printf("%c", it->s[i]);
- n--;
- }
- for (it++; n && it != ls.end(); it++) {
- for (int i = 0; n && i < it->len; i++) {
- printf("%c", it->s[i]);
- n--;
- }
- }
- printf("\n");
- }
- void Prev() {
- clk--;
- if (!clk) {
- cit--;
- clk = cit->len;
- }
- clen--;
- }
- void Next() {
- clk++;
- if (clk > cit->len) {
- cit++;
- clk = 1;
- }
- clen++;
- }
- void Maintain() {
- CIT j, k;
- for (CIT i = ls.begin(); i != ls.end(); i++) {
- j = i;
- j++;
- if (j == ls.end()) {
- break;
- }
- else if (i->len + j->len <= Bsize) {
- memcpy(i->s+i->len, j->s, j->len);
- i->len += j->len;
- k = j;
- k++;
- ls.erase(j, k);
- }
- }
- Move(clen);
- }
- };
- char S[20];
- int main() {
- freopen("editor2003.in", "r", stdin);
- freopen("editor2003.out", "w", stdout);
- editor txt;
- int T;
- scanf("%d", &T);
- int a;
- for (int i = 0; i < T; i++) {
- scanf("%s", S);
- if (S[0] == 'M') {
- scanf("%d", &a);
- txt.Move(a);
- }
- else if (S[0] == 'I') {
- scanf("%d", &a);
- txt.Insert(a);
- }
- else if (S[0] == 'D') {
- scanf("%d", &a);
- txt.Delete(a);
- }
- else if (S[0] == 'G') {
- scanf("%d", &a);
- txt.Get(a);
- }
- else if (S[0] == 'P') {
- txt.Prev();
- }
- else if (S[0] == 'N') {
- txt.Next();
- }
- txt.Maintain();
- }
- return 0;
- }
- //UBWH
-