【求助】蒟蒻调了2天了/kk
查看原帖
【求助】蒟蒻调了2天了/kk
121995
CrTsIr400楼主2020/7/24 19:55
#include<bits/stdc++.h>
#define F(i,a,b,c) for(int i=(a);(b);i=(c))
#define Fu(i,a,b) F(i,(a),i<=(b),i+1)
#define Fd(i,a,b) F(i,(a),i>=(b),i-1)
const int inf=1073741823;typedef long long LL;
int Fl,ch;template<typename t>int in(t&a){a=0;ch=getchar();Fl=1;while(((ch<'0')||(ch>'9'))&&ch!=EOF)Fl=(ch=='-')?-Fl:Fl,ch=getchar();if(ch==EOF)return 0;while((ch>='0')&&(ch<='9'))a=a*10+ch-'0',ch=getchar();a*=Fl;return 1;}template<typename t,typename ...ARGS>int in(t&a,ARGS&...args){return in(a)+in(args...);}
using namespace std;
struct node{int x;char op;}a[100],b[100];
#define mod 998244353
int ans17,ans19,bl,m;
void RD(node*a,int&len)
{
	ch=getchar();
	while(!isprint(ch))ch=getchar();
	len=1;
	while(isprint(ch))
	{
		if(isdigit(ch))(a[len].x*=10)+=ch-'0';
		else if(isgraph(ch))
		{
			if(ch!='a')
			++len,a[len].op=ch,++len;
			else a[len].x=1073741824;
		}
		ch=getchar();
	}
	if(!a[len].x)--len;
	a[0].op='(';
	a[len+1].op=')';
}
int al;
void print(node*a,int l,int r)
{
	Fu(i,l,r)
	{
		if(a[i].op)putchar(a[i].op);
		else
		{
			if(a[i].x==1073741024)printf("a");
			else 
			if(a[i].x)
			printf("%d",a[i].x);
		}
	}
	putchar(10);
}
int Pw(int x,int y)
{
	int res=1;
	for(;y;y>>=1,x=(x*x)%mod)if(y&1)res=(res*x)%mod;
	return res;
}
void cl(int l,int r,int an,node*a)
{
//	printf("[%d,%d]\n",l,r);
	int cl=0,cr=0;
//	print(a,l,r);
	Fu(i,l+1,r-1)if(a[i].op=='^')
	{
		cl=i-1;cr=i+1;
		while(a[cl].x==0&&cl>l)--cl;
		while(a[cr].x==0&&cr<r)++cr;
		a[cl].x=Pw(a[cl].x,a[cr].x);
		a[i].op=0;a[cr].x=0;
	}
//	printf("^ : ");print(a,l,r);
	Fu(i,l+1,r-1)if(a[i].op=='*')
	{
		cl=i-1;cr=i+1;
		while(a[cl].x==0&&cl>l)--cl;
		while(a[cr].x==0&&cr<r)++cr;
		a[cl].x=a[cl].x*a[cr].x;
		a[i].op=0;a[cr].x=0;
	}
//	printf("* : ");print(a,l,r);
	Fu(i,l+1,r-1)if(a[i].op=='+'||a[i].op=='-')
	{
		cl=i-1;cr=i+1;
		while(a[cl].x==0&&cl>l)--cl;
		while(a[cr].x==0&&cr<r)++cr;
		if(a[i].op=='+')a[cl].x=(a[cl].x+a[cr].x)%mod;
		else a[cl].x=(a[cl].x-a[cr].x)%mod;
		a[i].op=0;a[cr].x=0;
	}
//	printf("+-: ");print(a,l,r);
}
void calc(int l,int r,node*a)
{
	stack<int>s;
	int ans=0,st;
//	Fu(i,l,r)putchar(a[i].op?a[i].op:'_');
	Fu(i,l,r)
	{
		if(a[i].op=='(')s.push(i+1);
		if(a[i].op==')')
		{
			st=s.top();s.pop();
			cl(st,i-1,r,a);
			a[st-1].op=0;
			a[i].op=0;			
		}		
	}
	cl(1,al,al,a);
//	print(a,l,r);
//	putchar(10);
}
pair<int,int>ck(node*A,int Al)
{
	pair<int,int>res;
	node C[100];
	Fu(i,1,Al)C[i]=A[i];Fu(i,1,Al)if(A[i].x==1073741824)C[i].x=17;
	calc(1,Al,C);Fu(i,1,Al)if(C[i].x){res.first=C[i].x;break;}
	Fu(i,1,Al)C[i]=A[i];Fu(i,1,Al)if(A[i].x==1073741824)C[i].x=19;
	calc(1,Al,C);Fu(i,1,Al)if(C[i].x){res.second=C[i].x;break;}
	return res;
}
int main()
{
	freopen("equal.in","r",stdin);
	freopen("equal.out","w",stdout);
	RD(a,al);pair<int,int>ckans=ck(a,al);
//	printf("%d %d\n",ckans.first,ckans.second);
	in(m);
	Fu(i,1,m)
	{
		Fu(i,1,50)b[i].x=b[i].op=0;
		RD(b,bl);
//		print(b,bl);
		pair<int,int>bck=ck(b,bl);
		if(bck.first==ckans.first&&bck.second==ckans.second)
		putchar(i+'@');
//		printf("\n%d %d %d\n",i,bck.first,bck.second);
	}
	return 0;
}
//BY 线段树蒟蒻
/*
(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a
*/

为了方便留好了调试接口。

比较有可能是calccl函数出现问题。

外层无错。。。


(a+1+5)^3
1
(a +3*(1+5))*a^2+((1+5)*2*(1+5)+(1+5)^2)*a+(1+5)^3

这个有问题/kk

2020/7/24 19:55
加载中...