JZOJ·解压字符串【模拟】【DFS】

Description–

给你一个字符串S,S是已经被加密过的字符串。现在要求你把字符串S还原。字符串S可能会出现这样的格式:k(q),它表示字符串q重复了k次,其中q是0个或多个字符,而k是一个数字,范围是0至9。你只要把k(q)这样的格式全部展开,就能把S还原了,你要输出还原后的字符串的长度


Input–

一行,一个字符串S。字符串S只由‘(’、‘)’、0至9的数字组成,长度不超过50。所有的括号都是能匹配的,不用判断。

Output–

一个整数,还原后的字符串的长度。答案不会超过2147483647。


Sample Input–

【1】123
【2】10342(76)
【3】33(562(71(9)))
【4】0(0)
【5】1(1(1(1(1(1(1(0(1234567890)))))))
【6】1()66(5)

Sample Output–

【1】3
【2】8 解释:10347676
【3】19 解释:3567979567979567979
【4】0
【5】0
【6】7 解释:6555555


解题思路–


代码–

一、建议不要看,十分的zhizhang

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int t,y,a[100005];
bool f;
string s,x,z,ans;
string co(int xx,int yy)
{
	string tt="";
	for (int i=xx;i<=yy;++i)
	  tt+=s[i];
	return tt;
}
int main()
{
	freopen("b.in","r",stdin);
	freopen("b.out","w",stdout);
	
	cin>>s;
	for (int i=0;i<s.size();++i)
	  if (s[i]=='(') {f=1; break;}
	if (!f) {printf("%d",s.size()); return 0;}
	f=0;
	a[++t]=-1;
	for (int i=0;i<s.size();++i)
	{
		if (s[i]=='(')
		  a[++t]=i,f=0;
		if (s[i]==')')
		{
			if (!f) x=co(a[t]+1,i-1),f=1;
			else x=ans;
			y=int(s[a[t]-1]-48),z="";
			for (int j=1;j<=y;++j) z+=x;
			ans=co(a[t-1]+1,a[t]-2)+z;
			t--;
			if (t==1) a[t]=i;
		}
	}
	printf("%d\n",ans.size());
	
	return 0;
}

二、正解

#include<iostream>
#include<cstdio>
using namespace std;
string s;
string co(string ss,int xx,int yy)
{
	string tt="";
	for (int i=xx;i<=yy;++i)
	  tt+=ss[i];
	return tt;
}
int qwq(string a)
{
	int i=0,t=0,j;
	while (a[i]!='(' && i<a.size()) i++;
	if (a[i]=='(')
	{
		for (j=0;j<a.size()-i;++j)
	    {
		    if (a[i+j]=='(') t++;
		    if (a[i+j]==')') t--;
		    if (!t) break;
	    }
	    if (i+1==i+j) return i-1+qwq(co(a,i+j+1,a.size()-1));//“()”的情况
	    else return i-1+int(a[i-1]-48)*qwq(co(a,i+1,i+j-1))+qwq(co(a,i+j+1,a.size()-1));
	}
	else return i;//纯数字
}
int main()
{
	cin>>s;
	printf("%d",qwq(s));
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43654542/article/details/94738710