求助 TLE on #10
  • 板块CF756F Long number
  • 楼主DPseud
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/3/25 12:22
  • 上次更新2023/10/28 05:44:45
查看原帖
求助 TLE on #10
451825
DPseud楼主2022/3/25 12:22
#include<bits/stdc++.h>
using namespace std;
string s;
inline string add(string a,string b)
{
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	if(a.length()<b.length())swap(a,b);
	int tmp1,tmp2;
	int cjr=b.length();
	for(int i=0;i<a.length()-cjr;i++)b+='0';
	for(int i=0;i<a.length();i++)
	{
		tmp1=int(a[i])-48;
		tmp2=int(b[i])-48;
		int tmp3=tmp1+tmp2;
		a[i]=tmp3%10+48;
		char c=tmp3/10+48;
		if(i!=a.length()-1)a[i+1]+=(tmp3/10);
		else {a+=c;break;}
	}
	if(a[a.length()-1]=='0')a.erase(a.length()-1,1);
	int len=a.length();
	string ans="";
	for(int i=0;i<len;i++)ans+=a[i];
	reverse(ans.begin(),ans.end());
	return ans;
}
inline int cmpstr(string a,string b)
{
	if(a.length()>b.length())return 0;
	else if(a.length()<b.length())return 1;
	for(int i=0;i<a.length();i++)
	{
		if(a[i]>b[i])return 0;
		if(a[i]<b[i])return 1;
	}
	return 2;
}
inline void times(string &s);
inline void minus_plus(string &s)
{
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='-')
		{
			string beg="",hmd="";
			int kh1=0;
			bool xlhl=false;
			for(int j=i-1;j>=0;j--)
			{
				if(s[j]=='(')kh1--;
				if(s[j]==')')kh1++,xlhl=true;
				if(kh1==0&&(s[j]=='+'||s[j]=='-'))
				{
					break;
				}
				beg+=s[j];
			}
			int flen=beg.length();
			reverse(beg.begin(),beg.end());
			if(xlhl==true)
			{
				times(beg);
			}
			int tlen=beg.length();
			int kh2=0;
			bool lky=false;
			for(int j=i+1;j<s.length();j++)
			{
				if(s[j]=='(')lky=true,kh2++;
				if(s[j]==')')kh2--;
				if(kh2==0&&(s[j]=='+'||s[j]=='-'))break;
				hmd+=s[j];
			}
			int flen2=hmd.length();
			if(lky==true)times(hmd);
			int tlen2=hmd.length();
			s.erase(i-flen,flen);
			s.erase(i-flen+1,flen2);//4+2(1)-2(2) 
			s.insert(i-flen,beg);
			s.insert(i-flen+tlen+1,hmd);
			string ai_whk="";
			for(int wcao=0;cmpstr(beg,hmd)==1;beg=add(beg,"1"),wcao++)
			{
				if(wcao)ai_whk+=beg;
			}
			s.erase(i-flen+tlen,1);
			s.insert(i-flen+tlen,ai_whk);
		}
	}
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='+')
		{
			bool db=false;
			int kh3=0;
			for(int j=i-1;j>=0;j--)
			{
				if(s[j]=='(')kh3--;
				if(s[j]==')')db=true,kh3++;
				if((s[j]=='+'||s[j]=='-')&&kh3==0)break;
			}
			int cj1=0,cj2=0;
			if(db==true)
			{
				string lxl="";
				int kh4=0;
				for(int j=i-1;j>=0;j--)
				{
					if(s[j]=='(')kh4--;
					if(s[j]==')')kh4++;
					if((s[j]=='+'||s[j]=='-')&&kh4==0)break;
					lxl+=s[j];
				}
				int pjl=lxl.length();
				cj1=pjl;
				reverse(lxl.begin(),lxl.end());
				times(lxl);
				cj2=lxl.length();
				s.erase(i-pjl,pjl);
				s.insert(i-pjl,lxl);
			}
			bool dwb=false;
			int kh5=0;
			for(int j=i+1;j<s.length();j++)
			{
				if(s[j]==')')kh5--;
				if(s[j]=='(')dwb=true,kh5++;
				if((s[j]=='+'||s[j]=='-')&&kh5==0)break;
			}
			if(dwb==true)
			{
				string ddd="";
				int kh6=0;
				for(int j=i+1;j<s.length();j++)
				{
					if(s[j]=='(')kh6++;
					if(s[j]==')')kh6--;
					if((s[j]=='+'||s[j]=='-')&&kh6==0)break;
					ddd+=s[j];
				}
				int cengj=ddd.length();
				reverse(ddd.begin(),ddd.end());
				times(ddd);
				s.erase(i+1,cengj);
				s.insert(i,ddd);
			}
			s.erase(i-cj1+cj2,1);
		}
	}
}
inline void times(string &s)
{
	for(int i=0;i<s.length();i++)
	{
		string dgurunb,con,cont,pj;
		int kkk; 
		if(s[i]=='(')
		{
			dgurunb="";
			for(int j=i-1;j>=0;j--)
			{
				if(!(s[j]>='0'&&s[j]<='9'))break;
				dgurunb+=s[j];
			}
			reverse(dgurunb.begin(),dgurunb.end());
			kkk=1;
			con="";
			for(int j=i+1;j<s.length();j++)
			{
				if(s[j]==')'&&kkk==1)break;
				if(s[j]==')')kkk--;
				if(s[j]=='(')kkk++;
				con+=s[j];
			} 
			s.erase(i-dgurunb.length(),dgurunb.length()+2+con.length());
			minus_plus(con);
			times(con);
			cont="";
			pj="0";
			for(;cmpstr(pj,dgurunb)==1;pj=add(pj,"1"))
			{
				cont+=con;
			}
			s.insert(i-dgurunb.length(),cont);
		}
	}
}
long long ans=0;
inline void long_mod()
{
	for(int i=0;i<s.length();i++)
	{
		ans=(ans*10+s[i]-48)%1000000007;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>s;
	times(s);
	minus_plus(s);
	long_mod();
	printf("%d",ans);
}
2022/3/25 12:22
加载中...