比赛 20121030 评测结果 AWAAWWWAWA
题目名称 外星密码 最终得分 50
用户昵称 yuan 运行时间 0.005 s
代码语言 C++ 内存使用 3.15 MiB
提交时间 2012-10-30 21:15:27
显示代码纯文本
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
	int i,j,n,p,right,left;
	string com_text="",text="",prefix="",suffix="",s="",t;
	ifstream fin("passworda.in");
	ofstream fout("passworda.out");
	fin>>com_text;
	p=com_text.find('[');
	prefix=com_text.substr(0,p);//获取前缀
	com_text.erase(0,p);//删除前缀
	p=com_text.find_last_of(']');
	if(p+1<com_text.length())//获取后缀
	{
		suffix=com_text.substr(p+1,com_text.length()-p);
		com_text.erase(p+1);//删除后缀
	}
	n=com_text.length();//剩余的中间的压缩部分
	//获取重复的字符串
	if(n>0)
	{
		p=com_text.find(']');
		if(p>0)right=p-1;//字母部分右边界
		for(i=0;i<n;i++)if(com_text[i]>='A'&&com_text[i]<='Z'){left=i;break;}//字母左边界
		if(left<=right)s=com_text.substr(left,right-left+1);//取出字母串
		//获取重复部分的数字
		if(left>0)//有多重压缩
		{
			com_text.erase(left);//删除字母以后的字符,只剩下数字和'['
			p=com_text.find_last_of('[');
			text=s;
			while(p>=0)//获取每一个数字并更新text
			{
				i=p;//'['位置
				n=0;
				while(i+1<com_text.length()&&com_text[i+1]>='0'&&com_text[i+1]<='9')i++;//数字右边界
				for(j=p+1;j<=i;j++)n=n*10+com_text[j]-'0';//取数字
				if(n>1)
				{
					t="";
					for(j=1;j<=n;j++)t=t+text;
					text=t;
				}
				com_text.erase(p);//删除取过的数字及其前面的'['
				p=com_text.find_last_of('[');//获取下一个'['
			}
		}
	}
	fout<<prefix+text+suffix<<endl;//输出
	fin.close();fout.close();
	return 0;
}