记录编号 47253 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺十三]外星密码 最终得分 100
用户昵称 Gravataryuan 是否通过 通过
代码语言 C++ 运行时间 0.037 s
提交时间 2012-10-31 16:25:43 内存使用 2.84 MiB
显示代码纯文本
#include <fstream>
#include <string>
using namespace std;
string s="",text="";
int pt;//记录扫描进度指针
int getnum(int i)
{
	int n=0;
	while(s[i]>='0'&&s[i]<='9')
	{
		n=n*10+s[i]-'0';
		i++;
	}
	pt=i;//取完数字更新指针pt=i即数字后一个字符位置
	return n;
}

int decom(int p)
{
	int i,n,tp,t;
	while(1)
	{
		if(s[p]==']')return p;//处理完一层压缩,向外返回一层,带回该层尾部']'的位置,以备上一层从该位置开始继续
		if(s[p]!='[')
			text=text+s[p];//'['左边的字母
		else//s[p]=='[',准备进入该层
		{
			n=getnum(p+1);//获取'['后面的数字
			tp=pt;//保存该层递归的pt,因为接下来要从pt开始进行n次重复展开,pt又是全局变量,会随时改变,故保存
			for(i=1;i<=n;i++)//准备展开该层文本
			{
				t=decom(pt);//从数字后面的文本进行n次展开,pt不断变化,t指向下一个']'位置
				pt=tp;//恢复pt,因为pt在进入下一层递归时不断改变
			}
			p=t;//结束了一层的展开,p指向刚结束层的尾部']'
		}
		p++;//继续先后搜索
	}
	return 0;
}
int main()
{
	ifstream fin("passworda.in");
	ofstream fout("passworda.out");
	fin>>s;
	s=s+']';
	decom(0);//从压缩文本第一个位置开始解压缩
	fout<<text<<endl;
	fin.close();fout.close();
	return 0;
}