| 记录编号 | 
        47253 | 
        评测结果 | 
        AAAAAAAAAA | 
    
    
        | 题目名称 | 
        1239.[NOIP 2010冲刺十三]外星密码 | 
        最终得分 | 
        100 | 
            
    
    
        | 用户昵称 | 
         yuan | 
        是否通过 | 
        通过 | 
    
    
        | 代码语言 | 
        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;
}