有注释,求助各位大佬,感激不尽
  • 板块P1928 外星密码
  • 楼主Ryoo
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/10/15 17:14
  • 上次更新2024/10/15 19:56:26
查看原帖
有注释,求助各位大佬,感激不尽
1100140
Ryoo楼主2024/10/15 17:14

20分,

测试点一数据:
输入
[2[2[2NOTOMAMIKO]]]
输出
NOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKO
代码:
#include <bits/stdc++.h>
using namespace std;
char a[20005],b[20005];
int anowpot,bnowpot;

void dp(int ceng, int asta,int bsta) {		//bsta表示要从该坐标开始重复操作
	int renum = 0,coun = bsta;		//renum表示要重复的次数,coun表示对b数组进行处理时的临时下标
	for(int i = asta; i < strlen(a); i++) {
		if(a[i] == '[') {
			dp(ceng++, i+1,coun);
			i = anowpot; coun = bnowpot;	//递归完成后将在a遍历的i和在b遍历的coun赋值为最近一次递归完成后的值
		}
		else if(a[i] >= '0' && a[i] <= '9') {
			int st = i,en = i,s = 1;
			//处理两位以上的数字
			while(a[i+1] >= '0' && a[i+1] <= '9') {
				en++;
			}
			for(int j = en; j >= st; j--) {
				renum += s*(a[j]-'0'); s*=10;
			}
			
		}
		else if((a[i] >= 65 && a[i] <= 90) || (a[i] >= 97 && a[i] <= 122)) {	//若为字母
			b[coun] = a[i];coun++;
		}
		else if(a[i] == ']') {			//检测到为']'则对b复制renum次后return
			int t1 = bsta, t2 = coun;
			//coun+=1;
			for(int j = 1; j < renum; j++) {
				for(int k = 0; k < t2-t1+1; k++) {b[coun] = b[t1+k];coun++;}
				
			}
			anowpot = i+1;bnowpot = coun;
			return;
		}
		
	}
}
int main() {
	cin>>a;
	dp(1,0,0);
/*
	for(int i = 0; i < 20000; i++) {
		if(!(b[i] == 0 && b[i+1] == 0)) {
			if(b[i] == 0) continue;
			printf("%c", b[i]);
		}
		else break;
	}
*/
	printf("%s", b);
	return 0;
}
2024/10/15 17:14
加载中...