JZOJ・解凍列[シミュレーション] [DFS]

説明 -

あなたの文字列を暗号化されたS、Sの文字列を与えます。今、私たちは、文字列Sを復元するように依頼します ストリングSは、このフォーマットを発生することがありますk回繰り返される文字列Qを表すK(q)は、qは0個以上の文字であり、kは0~9の範囲の数です。あなただけの展開のこの形式のK(q)を入れて、Sを使用すると、出力復元したい文字列の後に、復元することができる長さを


入力-

行、列S. 唯一の文字列の数字からなるS「(」「」)、0~9、多くて50未満の長さ。すべてのブラケットは判断してはいけない、と一致することができます。

出力-

整数、文字列の長さを短く。答えは2,147,483,647以上ではありません。


サンプル入力 -

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

サンプル出力 -

3 [1]
[2] 8について説明:10347676
[3]図19は、説明した:3567979567979567979を
[4] 0
[0] 5
[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