60分求带(用的是模拟)
查看原帖
60分求带(用的是模拟)
586455
liyiHuan楼主2022/6/23 16:29
#include <bits/stdc++.h>
using namespace std;

string s, tmp;
string num, sum, res;
int fid = 0;

bool judNum(char a)
{
	if ('0' <= a && a <= '9') return true;
	return false;
}

string flatStr(string t) // 模拟展开一层 
{
	reverse(t.begin(), t.end());
	int i=0, p=1;
	
	num.clear(), sum.clear(), res.clear(); // 清空 
	
	while (judNum(t[i])) num += t[i], i ++; // 取得数字 
	
	if (!num.empty()) p = atoi(num.c_str()); // 没有就默认 p = 1 
	
	while (i < t.size() && i != ']')
	{
		res += t[i];
		i ++;
	} // 得到一个小单元 res 
	
	while (p --)
	{
		sum += res; // 累加 
	}
	
	return sum;
}

// 模拟法 
int main ()
{
	int i=0, len;
	cin >> s; //已知 [数 一定定于 ]数 
	
	fid = s.find(']',fid);//  
	
	while (fid != string::npos) 
	{
		tmp.clear();
		
		i = fid-1;

		while (s[i] != '[')
		{
			tmp += s[i];
			i --; // tmp = NUF3 
		}
		len = tmp.size(); // +2
		
		s.insert(fid+1,flatStr(tmp)); // 在原来的后面插入展开的字符串 
		
		s.erase(i,len+2); // 删除原来的	[3FUN] 
		
		fid = s.find(']',i); // 查找下一个 ] 
	}
	
	cout << s; 

	return 0;	
} 

/*
错的数据
GDWKUW[49C[50O]OY][37W[82WOTYG]]M
*/

实在是找不出来为什么wa 看了第六个测试点 用手模拟了一下 还是找不出为什么 第六个测试点 GDWKUW[49C[50O]OY][37W[82WOTYG]]M

2022/6/23 16:29
加载中...