列表

详情


NC236595. 向前文本编辑器

描述

牛牛需要一个程序帮它码一段文字,初始时文本为空,光标在文本最前方。

牛牛会发出 m 条指令,指令分两种:
     这里  且 s 是一个字符串,代表在当前光标位置插入字符串 s 并把光标移到 s 的末尾(并不是整个文本的末尾)。
     这里  且 x 是一个正整数,代表将光标向前移动 x 个位置(保证不会超过光标前字符的个数)。

牛妹觉得这种程序已经有人做过类似的了,所以她把这题稍微修改了一点。

在原本需要输入字符串 s 的地方,牛妹将只会给出一个正整数 len 代表 s 的长度,而 s 则被定义为字符串 T 的第 1 到第 len 个字符组成的子串。
这里的字符串 T 被定义成由循环节 "abcd…xyz012…89ABCD…XYZ" ,组成的无限长字符串。

现在请你帮牛牛实现这个文本编辑器,并输出文本最后的状态(由于最后文本可能过于庞大,所以这里只需要输出文本的第 1 和第  个字符直到文本末尾)以及光标前方字符的个数,两者用一个空格分隔。

输入描述

第一行一个整数 m 代表操作数。
接下来 m 行,每行描述了一个操作。
保证:
 ,所有 len 的和不超过

输出描述

输出共一行一个字符串和整数分别代表文本最后的状态(如题意压缩后)和光标前方字符的个数。

示例1

输入:

5
1 3
1 2
2 3
1 2
2 1

输出:

a 3

说明:

此时的文本为:“aba|bcab”。
其中 '|' 代表光标的位置。

示例2

输入:

2
1 100
2 60

输出:

aB 40

说明:

此时的文本为:“abcd…xyz012…89ABCD…UVWX|YZabcd…xyz012…89AB”。
其中 '|' 代表光标的位置。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 219ms, 内存消耗: 89144K, 提交时间: 2022-09-26 11:36:55

#import<bits/stdc++.h>
using namespace std;enum{N=1<<24};int i,e,o,x,p,l[N],r[N];
char*b="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",c[N];
int main(){
  for(cin>>o;cin>>o>>x;)if(o&1){
    for(i=0;i<x;++i)c[++e]=b[i%62],l[e]=p,r[e]=r[p],l[r[p]]=e,r[p]=e,p=e;
  }else for(;x--;p=l[p]);
  for(o=0,i=*r,x=1;i;i=r[i],++x){
    if(x==1||x%100==0)
      cout<<c[i];
    if(p==i)o=x;
  }cout<<' '<<o;
}

C++(clang++ 11.0.1) 解法, 执行用时: 405ms, 内存消耗: 3552K, 提交时间: 2022-09-20 21:22:47

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	scanf("%d",&t);
	string ans="";
	int x=0;
	while(t--)
	{
		int op,y;
		string s;
		scanf("%d",&op);
		if(op==1)
		{
			cin>>s;
			ans.insert(x,s);
			x+=s.size();
		}
		else
		{
			scanf("%d",&y);
			x-=y;
		}
	}
	cout<<ans<<" "<<x<<endl;
    return 0;
}

上一题