#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了
样例能过