JZOJ 1519解凍文字列
説明 -
あなたの文字列を暗号化された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;
}