最离谱的一集
查看原帖
最离谱的一集
788951
TLE_AK楼主2023/10/20 19:37
#include<bits/stdc++.h>
using namespace std;

namespace akak
{
	int Num[100010][4],Z[100010];
	char S[100010]; 
	 
	int mod=10007;
	int w=0,nw=0;
	void c()
	{
		int b=Num[nw][1]*Num[nw-1][1];
		int a=Num[nw][0]*(Num[nw-1][1])%mod+Num[nw-1][0]*(Num[nw][1])%mod+Num[nw-1][0]*(Num[nw][0]);
		nw--;
		Num[nw][0]=a%mod;
		Num[nw][1]=b%mod;
	}
	void j()
	{
	//	cout<<6<<endl;
		int a=Num[nw-1][0]*Num[nw][0];
		int b=Num[nw][1]*(Num[nw-1][1]+Num[nw-1][0])%mod+Num[nw-1][1]*(Num[nw][0])%mod;
		nw--;
		Num[nw][0]=a%mod;
		Num[nw][1]=b%mod;
	}
	int main()
	{
		int n;
		scanf("%d",&n);
		scanf("%s",S+1);
		S[0]='(';
		S[n+1]=')';
		for(int i=0;i<=n+1;i++)
		{
			//cout<<i<<endl;
			if(S[i]=='(')
			{
				Z[++w]=1;
				if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
			}
			else if(S[i]==')')
			{
				
				while(Z[w]!=1)
				{
					//cout<<Num[nw][1]<<endl;
					if(Z[w]==2)j();
					else c();
				//	cout<<Num[nw][0]<<endl;
					w--;
				//	cout<<Z[w];
				}
				w--;
			//	if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
			}
			else if(S[i]=='*')
			{
				while(Z[w]==3&&w)
				{
					c();
					w--;
				}
			
				Z[++w]=3;
				if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
			}
			else
			{
				while(Z[w]!=1&&w)
				{
					if(Z[w]==2)j();
					else c();
					w--;
				}
			
				Z[++w]=2;
				if(S[i+1]!='(')Num[++nw][0]=Num[nw][1]=1;
			}
		//	cout<<Z[w]<<endl;
		/*	for(int i=1;i<=nw;i++)
			{
				cout<<Num[i][1]<<' ';
			}
			cout<<endl;*/
		}
		cout<<Num[1][0];
		return 0;
	}
} 
int main()
{
//	freopen("exp.in","r",stdin);
//	freopen("exp.out","w",stdout);
	akak::main();
	return 0;
}

这段代码我在洛谷上0pts,但是下载数据后是对的(其他oj也是)

2023/10/20 19:37
加载中...