图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多多新书加入,为了更方便地管理图书(以便F帮助想要借书的客人快速查找是否有他们所需要的书),我们需要设计一个图书查找系统。
这个系统需要支持2种操作:
add(s),表示新加人一本书名为s的图书。
find(s),表示查询是否存在一本书名为s的图书。
第一行包括一个正整数n(n≤30000),表示操作数。
以下n行,每行给出2种操作中的某一种指令条,指令格式为:
add S
find S
在书名s与指令(add,find)之间有一个空格隔开,我们保证所有书名的长度都不超过200。可以假设读入数据是准确无误的。
对于每条find(s)指令,我们必须对应地输出一行yes 或no,表示当前所查询的书是否存在于图书馆内。
注意:一开始时图书馆内是没有一本图书的,并且,对于相同字母不同大小写的书名,我们认为它们是不同的。
4
add Inside C#
find Effective Java
add Effective Java
find Effective Java
no
yes
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:
#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
我查了一下,好像是栈溢出或数组越界,我输出了一下sum1和sum2,确实是负数。
但为什么第二个代码就没有越界呢?
请问各位dalao们,这是为什么啊?