求助站外题
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/2/14 21:41
  • 上次更新2023/10/28 08:30:56
查看原帖
求助站外题
531741
封禁用户楼主2022/2/14 21:41

题目链接

题目描述

图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多多新书加入,为了更方便地管理图书(以便F帮助想要借书的客人快速查找是否有他们所需要的书),我们需要设计一个图书查找系统。

这个系统需要支持2种操作:

add(s),表示新加人一本书名为s的图书。

find(s),表示查询是否存在一本书名为s的图书。

输入描述

第一行包括一个正整数n(n30000) n(n \leq 30000),表示操作数。

以下n行,每行给出2种操作中的某一种指令条,指令格式为:

add S

find S

在书名s与指令(add,find)之间有一个空格隔开,我们保证所有书名的长度都不超过200。可以假设读入数据是准确无误的。

输出描述

对于每条find(s)指令,我们必须对应地输出一行yesno,表示当前所查询的书是否存在于图书馆内。

注意:一开始时图书馆内是没有一本图书的,并且,对于相同字母不同大小写的书名,我们认为它们是不同的。

样例输入

4
add Inside C#
find Effective Java
add Effective Java
find Effective Java

样例输出

no
yes

code1:code1:

#include<bits/stdc++.h>
using namespace std;
const int mod1=155339,mod2=155399,p1=15539,p2=93551;
int n,cnt,l,sum1,sum2,head[300300];
char c[10],s[500];
struct AC{
	int nxt,to;
}e[300300];
inline void add(int x,int y)
{
	cnt++;
	e[cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
	return;
}
inline bool query(int x,int y)
{
	for(int i=head[x];i;i=e[i].nxt)
		if(y==e[i].to)
			return 1;
	return 0;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		gets(s);
		l=strlen(s);
		sum1=0; sum2=0;
		for(int i=0;i<l;i++)
		{
			sum1=(sum1*p1+s[i])%mod1;
			sum2=(sum2*p2+s[i])%mod2;
		}
		if(c[0]=='a')
			add(sum1,sum2);
		else
			query(sum1,sum2)?puts("yes"):puts("no");
	}
	return 0;
}

code2:code2:

#include<bits/stdc++.h>
using namespace std;
const int mod1=155339,mod2=155399,p1=15539,p2=93551;
struct AC{
	int nxt,to;
}e[300300];
int n,cnt,l,sum1,sum2,head[300300];
char c[10],s[500];
inline void add(int x,int y)
{
	cnt++;
	e[cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
	return;
}
inline bool query(int x,int y)
{
	for(int i=head[x];i;i=e[i].nxt)
		if(y==e[i].to)
			return 1;
	return 0;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		gets(s);
		l=strlen(s);
		sum1=0; sum2=0;
		for(int i=0;i<l;i++)
		{
			sum1=(sum1*p1+s[i])%mod1;
			sum2=(sum2*p2+s[i])%mod2;
		}
		if(c[0]=='a')
			add(sum1,sum2);
		else
			query(sum1,sum2)?puts("yes"):puts("no");
	}
	return 0;
}

两个代码只有4~8行有差异,但第一个代码就不对,显示

Process exited after 0.5093 seconds with return value 3221225477

我查了一下,好像是栈溢出或数组越界,我输出了一下sum1sum1sum2sum2,确实是负数。

但为什么第二个代码就没有越界呢?

请问各位dalao们,这是为什么啊?

2022/2/14 21:41
加载中...