2017百度之星复赛1001 Arithmetic of Bomb

算是想法题吧  写的有点乱


#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;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值