JZOJ 1519 解压字符串
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;
}