求救
查看原帖
求救
288476
ll_dio楼主2024/11/26 15:47

下面这份代码本地自测和洛谷在线IDE上可以过测试点 4,但是在洛谷上提交无法通过。

#include<bits/stdc++.h>
#define N 1000009
#define L 29
using namespace std;
typedef long long ll;
ll nV,p[N];
string s;
vector<ll> son[N];
struct Maths{
	ll mul[L];
	Maths operator+(const Maths&b)const{
		Maths now;
		for(ll i=0;i<L;i++) now.mul[i]=mul[i]+b.mul[i];
		return now;
	}
	Maths operator*(const Maths&b)const{
		Maths now;
		for(ll i=0;i<L;i++) now.mul[i]=0;
		for(ll i=0;i<L;i++)
			for(ll j=0;j<L;j++){
				if(i+j>=L) continue;
				now.mul[i+j]+=mul[i]*b.mul[j];
			}
		return now;
	}
} a[N];
void dfs(ll u,ll fa){
	Maths now;
	for(ll i=0;i<L;i++) now.mul[i]=0;
	for(ll i=0;i<son[u].size();i++){
		ll v=son[u][i];
		dfs(v,u);
		Maths now2=a[u]*a[v];
		now=now+now2;
	}
	if(son[u].size()>0) a[u]=now;
}
int main(){
	nV=1; a[1].mul[0]++;
	ll u=1; bool hulie=0; ll cnt=0;
	while(1){
		getline(cin,s); ll i;
		for(i=0;i<s.size();i++){
			if(s[i]=='b'&&s[i+1]=='e') i+=5;
			else if(s[i]=='l'){
				ll j=i+5; ll num=0;
				bool flag=1;
				for(;j<s.size();j++){
					if(s[j]==' ') break;
					if(s[j]=='n'){
						flag=0;
						continue;
					}
					num=10*num+(s[j]-'0');
				}
				i=j;
				if(hulie){
					cnt++;
					continue;
				}
				son[u].push_back(++nV); p[nV]=u;
				if(flag) a[nV].mul[0]=num;
				else a[nV].mul[1]=1;
				u=nV; 
				son[u].push_back(++nV);
			}else if(s[i]=='o'){
				ll j=i+3,num=0; bool flag=1;
				for(;j<s.size();j++){
					if(s[j]==' ') break;
					if(s[j]=='n'){
						flag=0;
						continue;
					}
					num=10*num+(s[j]-'0');
				}
				i=j;
				if(hulie) continue;
				son[u].push_back(++nV); p[nV]=u;
				if(flag) a[nV].mul[0]=num;
				else a[nV].mul[1]=1;
			}else if(s[i]=='c'){
				i+=8;
				if(u==1) continue;
				hulie=1;
			}else if(s[i]=='b'){
				i+=5;
				if(u==1) continue;
				if(hulie) continue;
				a[u].mul[1]=0; a[u].mul[0]=1;
				hulie=1;
			}else if(s[i]=='e'){
				if(cnt>0) cnt--;
				else{
					hulie=0;
					if(u==1) break;
					u=p[u];
				}
				i+=3;
			}
		}
		if(i<s.size()) break;
	}
	dfs(1,0);
	bool flag=0;
	for(ll i=L-1;i>=0;i--){
		if(!a[1].mul[i]) continue;
		if(flag) cout<<"+";
		else flag=1;
		if(a[1].mul[i]>1||i==0) cout<<a[1].mul[i];
		if(i>0) cout<<"n";
		if(i>1) cout<<"^"<<i;
	}
	if(!flag) cout<<"0";
	return 0;
}

2024/11/26 15:47
加载中...