算是想法题吧 写的有点乱
#include<cstdio>
#include<string>
#include<stack>
#include<queue>
#include<cmath>
#include<stack>
#include<list>
#include<map>
#include<set>
typedef long long ll;
using namespace std;
const int MAXN=1005;
char a[1005];
char b[100005];
const ll mod=1000000007;
int main()
{
ll i,j,m,n;//wa了几发 干脆都直接改成long long 了 就过了...
int T;
scanf("%d",&T);
while(T—)
{
int flag=0;
scanf("%s",a);
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]=='(')//检测一下是不是纯数字
{
flag=1;
break;
}
}
if(flag==0)//是纯数字就直接输出
{
ll ans=0;
for(i = 0; i < n; ++i)//大数取模
{
ans = ans*10 + (a[i]-'0');
ans %= mod;
}
printf("%lld\n",ans);
continue;
}
ll x1,y1;//first 记录每组括号的第一对括号所对应的下标
ll x2,y2;//second 第二对
flag=4;//==4说明当前检测的元素不在任何一个括号中 (12)#(2)4(2)#(3) 这个样例中的4就是
i=0;
int cnt=0;
while(i!=n)
{
if(a[i]=='('&&flag==4)//第一组的左括号
{
flag=1;
x1=i;
}
else if(a[i]==')'&&flag==1)//第一组的右括号
{
flag++;
y1=i;
}
else if(a[i]=='('&&flag==2)//第二组的左括号
{
x2=i;
}
else if(a[i]==')'&&flag==2)//第二组的右括号
{
flag++;
y2=i;
}
else if(flag==4&&a[i]>='0'&&a[i]<='9')
{
b[cnt++]=a[i];
}
if(flag==3)//flag==3代表已经找到了两队括号 这两对括号中间夹着‘#’
{
flag=4;
ll ans=0;
for(j=x2+1;j<y2;j++)
{
ans*=10;
ans+=a[j]-'0';
}
for(j=1;j<=ans;j++)
{
for(int k=x1+1;k<y1;k++)
{
b[cnt++]=a[k];
}
}
}
i++;
}
ll ans=0;//一定要开long long
for(i = 0; i < cnt; ++i)//大数取模
{
ans = ans*10 + (b[i]-'0');
ans %= mod;
}
printf("%lld\n",ans%mod);
}
return 0;