记录编号 |
47253 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[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;
}