为啥模拟题我超时了?用的是O(tL)的算法。(可能有点长) fuckccf
查看原帖
为啥模拟题我超时了?用的是O(tL)的算法。(可能有点长) fuckccf
97737
Wsyflying2022楼主2020/10/14 23:10
#include <bits/stdc++.h>
using namespace std;
int n; 
bool bo[26],bo2[26],bo3[26];
stack <char> str;
int main()
{
	freopen("201702.in","r",stdin);
	freopen("201702.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		memset(bo,0,sizeof(bo));
		memset(bo2,0,sizeof(bo2));
		memset(bo3,0,sizeof(bo3));
		while (!str.empty()) str.pop();
		int m,t=0,sumf=0,ans=1,p=1,flag2=false;
		bool flag=true;
		scanf("%d",&m);
		char ch='A',temp;
		while (ch!='O') ch=getchar();
		ch=getchar();ch=getchar();
		if (ch=='1') t=1;
		else 
		{
		    ch=getchar();
	        ch=getchar();
		    while (ch<='9' && ch>='0') 
		    {
		    	t=t*10+ch-'0';
		    	ch=getchar();
			}
		    t++;
		}
		for (int j=1;j<=m;j++)
		{
			while (ch!='E' && ch!='F') ch=getchar();
			if (ch=='E')
			{
				sumf--;
				if (sumf<0) 
				{
					flag=false;
					break;
				}
				char c=str.top();
				bo[c-'a']=false;
				if (bo2[c-'a']) flag2=false,bo2[c-'a']=false;
				str.pop();
				ch='X';
				if (bo3[c-'a'])
				{
					ans=max(ans,p);
					p--;
					bo3[c-'a']=false;
				}
				if (sumf==0)
				{
				  ans=max(ans,p);
				  p=1;
				}
				continue;
			}
			sumf++;
			while (ch>'z' || ch<'a') ch=getchar();
			if (bo[ch-'a'])
			{
				flag=false;
				break;
			}
			bo[ch-'a']=true;
			str.push(ch);
			temp=ch;
			while (!(ch<='9' && ch>='0') && !(ch=='n')) ch=getchar();
			if (ch=='n' && !flag2) 
			{
				ch=getchar();
				while (!(ch<='9' && ch>='0') && !(ch=='n')) ch=getchar();
				if (ch=='n') continue;
				bo2[temp-'a']=true;
				flag2=true;
			}
			else 
			{
				int tt=0;
				while (ch<='9' && ch>='0')
				{ 
				    tt=tt*10+ch-'0';
				    ch=getchar(); 
				}
				while (!(ch<='9' && ch>='0') && !(ch=='n')) ch=getchar();
				if (ch=='n' && !flag2) 
				{
				    p++;
				    bo3[temp-'a']=true;
				}
				else
				{
				  int tt2=0;
				  while (ch<='9' && ch>='0')
				  { 
				      tt2=tt2*10+ch-'0';
				      ch=getchar(); 
				  }
				  if (tt>tt2 && !flag2)
				  {
				      bo2[temp-'a']=true;
				      flag2=true;
			      }
				}
			}
		}
		ans=max(ans,p);
		if (!flag || sumf) printf("ERR\n");
		else if (ans==t) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
2020/10/14 23:10
加载中...