求调,#1#2WA
查看原帖
求调,#1#2WA
807375
2021CHD楼主2023/7/18 21:35

评测记录

#include<cstdio>
#include<cstring>
using namespace std;
const long long p=3371,mod=998861;
long long q,o,x,top=1,i,v[1000000],len[1000000],lenn,sum,ans;
char hash[1000000][25],input[25];
long long getk(long long l)
{
	long long ans=l,i;
	for(i=1;i<=l;i++)
	ans=(ans*p+input[i])%mod;
	return ans;
}
long long in(long long l,long long x)
{
	long long k=getk(l),i;
	while(len[k]!=0)
	{
		if(len[k]==l)
		{
			for(i=1;i<=l;i++)
			if(hash[k][i]!=input[i])
			break;
			if(i>l)
			{
				v[k]=x;
				return 0;
			}
		}
		k=(k+1)%mod;
	}
	strcpy(hash[k]+1,input+1);
	len[k]=l;
	v[k]=x;
	return 1;
}
long long find(long long l)
{
	long long k=getk(l),i;
	while(len[k]!=0)
	{
		if(len[k]==l)
		{
			for(i=1;i<=l;i++)
			if(hash[k][i]!=input[i])
			break;
			if(i>l)
			return v[k];
		}
		k=(k+1)%mod;
	}
	return -1;
}
long long dlt(long long l)
{
	long long k=getk(l),i;
	while(len[k]!=0)
	{
		if(len[k]==l)
		{
			for(i=1;i<=l;i++)
			if(hash[k][i]!=input[i])
			break;
			if(i>l)
			{
				len[k]=0;
				return 1;
			}
		}
		k=(k+1)%mod;
	}
	return -1;
}
main()
{
	scanf("%lld",&q);
	for(i=1;i<=q;i++)
	{
		scanf("%lld",&o);
		if(o<4)
		{
			scanf(" %s",input+1);
			lenn=strlen(input+1);
		}
		if(o==1)
		{
			scanf("%lld",&x);
			sum=sum+in(lenn,x);
			printf("OK\n");
		}
		else if(o==2)
		{
			ans=find(lenn);
			if(ans==-1)
			printf("Not found\n");
			else
			printf("%lld\n",ans);
		}
		else if(o==3)
		{
			ans=dlt(lenn);
			if(ans==-1)
			printf("Not found\n");
			else
			{
				sum--; 
				printf("Deleted successfully\n");
			}
		}
		else
		printf("%lld\n",sum);
	}
}

用的是手打哈希,在很后面才WA。

#1 在第24713行WA

#2 在第10535行WA

#3 #4 #5 都AC了

样例能过

2023/7/18 21:35
加载中...