记录编号 376298 评测结果 AAAAAAAAAA
题目名称 [NOI 2003]文本编辑器 最终得分 100
用户昵称 GravatarKZNS 是否通过 通过
代码语言 C++ 运行时间 1.625 s
提交时间 2017-02-26 23:21:06 内存使用 0.31 MiB
显示代码纯文本
  1. //KZNS
  2. #include <cstdio>
  3. #include <list>
  4. #include <memory.h>
  5. using namespace std;
  6. #define Bsize 5000
  7. class block { public:
  8. int len;
  9. char s[Bsize];
  10. block() {
  11. len = 0;
  12. }
  13. };
  14. typedef list<block>::iterator CIT;
  15. class editor { public:
  16. list<block> ls;
  17. list<block>::iterator cit;
  18. int clk, clen;
  19. editor() {
  20. ls.push_front(block());
  21. cit = ls.begin();
  22. clk = 0;
  23. clen = 0;
  24. }
  25. void Split(CIT it, int lk) {
  26. if (lk == it->len)
  27. return;
  28. else {
  29. block u;
  30. u.len = it->len - lk;
  31. memcpy(u.s, it->s+lk, u.len);
  32. it->len = lk;
  33. ls.insert(++it, u);
  34. }
  35. }
  36. void Move(int a) {
  37. clen = a;
  38. for (CIT i = ls.begin(); i != ls.end(); i++) {
  39. if (a <= i->len) {
  40. cit = i;
  41. clk = a;
  42. break;
  43. }
  44. else {
  45. a -= i->len;
  46. }
  47. }
  48. }
  49. void Insert(int n) {
  50. Split(cit, clk);
  51. CIT u;
  52. char c;
  53. u = cit;
  54. CIT uu;
  55. for (int i = 0; i < n; i++) {
  56. do {
  57. c = getchar();
  58. } while (c < 32 || c > 126);
  59. if (u->len == Bsize) {
  60. uu = u;
  61. ls.insert(++u, block());
  62. u = ++uu;
  63. }
  64. u->s[u->len++] = c;
  65. }
  66. }
  67. void Delete(int n) {
  68. Split(cit, clk);
  69. CIT it = cit;
  70. for (it++; it != ls.end(); it++) {
  71. if (it->len < n) {
  72. n -= it->len;
  73. }
  74. else {
  75. Split(it, n);
  76. break;
  77. }
  78. }
  79. CIT bbb = cit;
  80. ls.erase(++bbb, ++it);
  81. }
  82. void Get(int n) {
  83. CIT it = cit;
  84. for (int i = clk; n && i < it->len; i++) {
  85. printf("%c", it->s[i]);
  86. n--;
  87. }
  88. for (it++; n && it != ls.end(); it++) {
  89. for (int i = 0; n && i < it->len; i++) {
  90. printf("%c", it->s[i]);
  91. n--;
  92. }
  93. }
  94. printf("\n");
  95. }
  96. void Prev() {
  97. clk--;
  98. if (!clk) {
  99. cit--;
  100. clk = cit->len;
  101. }
  102. clen--;
  103. }
  104. void Next() {
  105. clk++;
  106. if (clk > cit->len) {
  107. cit++;
  108. clk = 1;
  109. }
  110. clen++;
  111. }
  112. void Maintain() {
  113. CIT j, k;
  114. for (CIT i = ls.begin(); i != ls.end(); i++) {
  115. j = i;
  116. j++;
  117. if (j == ls.end()) {
  118. break;
  119. }
  120. else if (i->len + j->len <= Bsize) {
  121. memcpy(i->s+i->len, j->s, j->len);
  122. i->len += j->len;
  123. k = j;
  124. k++;
  125. ls.erase(j, k);
  126. }
  127. }
  128. Move(clen);
  129. }
  130. };
  131. char S[20];
  132. int main() {
  133. freopen("editor2003.in", "r", stdin);
  134. freopen("editor2003.out", "w", stdout);
  135. editor txt;
  136. int T;
  137. scanf("%d", &T);
  138. int a;
  139. for (int i = 0; i < T; i++) {
  140. scanf("%s", S);
  141. if (S[0] == 'M') {
  142. scanf("%d", &a);
  143. txt.Move(a);
  144. }
  145. else if (S[0] == 'I') {
  146. scanf("%d", &a);
  147. txt.Insert(a);
  148. }
  149. else if (S[0] == 'D') {
  150. scanf("%d", &a);
  151. txt.Delete(a);
  152. }
  153. else if (S[0] == 'G') {
  154. scanf("%d", &a);
  155. txt.Get(a);
  156. }
  157. else if (S[0] == 'P') {
  158. txt.Prev();
  159. }
  160. else if (S[0] == 'N') {
  161. txt.Next();
  162. }
  163. txt.Maintain();
  164. }
  165. return 0;
  166. }
  167. //UBWH
  168.