下面这份代码本地自测和洛谷在线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;
}