toj2943帮忙查查代码为什么不能accept

来源:百度知道 编辑:UC知道 时间:2024/06/15 01:24:45
这是我的代码
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
char lib[n][19];
char word[19];
char no;
int length1[n];
int length2[501];
for(int i=0;i<n;i++){
cin>>lib[i];
length1[i]=strlen(lib[i]);
}
for(int m=0;m<501;m++){
cin>>word;
no=cin.get();
length2[m]=strlen(word);
if(length2[m]>2){
for(int j=0;j<n;j++){
if(length2[m]==length1[j])
if(word[0]==lib[j][0])
if(word[(length2[m]-1)]==lib[j][(length2[m]-1)])
cout<<lib[j];
}}
else
cout<<word;
if(no=='\n')
cout<<endl;
else
cout<<" ";
memset(word,0,21);
}
return 0;
}
运行代码后题目给的例子运算都对,就是提交之后不能accept。希望各位帮我看看这段代码有什么问题。或者帮我用c++语言写一段简单的能够accept的代码。。。多谢。。。如果成功的话我会追加分的。。。。
1楼的,我的代码运行没问题,而且所给例子运行后也没问题。不知道你说

楼主那样做是可行的,因为 lib[n][19] 是一个局部数组,局部变量是保存在堆栈里面的,空间是在运行时分配的,程序执行到这里时,根据 n 值的大小,调整堆栈指针 esp 来分配空间,子程序返回的时候,再让这些空间出栈,这是一个完全动态的过程,所以 n 可以是一个变量。除非 lib 是个全局数组,大小才需要在编译期间确定好。

但是堆栈的空间毕竟是不大的,因此这种做法并不推崇,如果遇到 n 很大的情况,lib[n][19] 就是一个很大的数组,保存在堆栈里面极有可能造成栈溢出,提交到 OJ 上就会返回莫名其妙的 runtime error,所以一般来说数组还是建议都定义成全局的。

这个题目,首先楼主你的算法是错误的,题目说了:加密算法是保持单词首尾两个字母不变,中间的字母顺序打乱,但是在你的判断语句中

if(length2[m]==length1[j])
if(word[0]==lib[j][0])
if(word[(length2[m]-1)]==lib[j][(length2[m]-1)])
cout<<lib[j];

只判断了
1. 长度相等
2. 首字母一样
3. 尾字母一样

而并没有考虑中间的字母,也就是说,对于你这个算法,完全有可能把比如 asker 当成是对 after 的加密,但其实两者是不同的单词,因为 ske 和 fte 里的字母再怎么改变顺序也不可能相同。所以除了上面3个条件的判断之外,你还应该考虑单词中间的字母是否匹配,常规的做法是将两者中间的字母都拿出来,构成两个列表,然后分别排序,再一一比较。

代码方面,还有一处比较严重的错误在这一句:

memset(word,0,21);

因为根据你的定义,word这个数组事实上只有19个字节,但是你 memset 却清空了连续 21 个字节的内容,结果就是造成 word 数组以外的变量也被清掉了,这里应该改成

memset(word,0,sizeof(word)); // 应该是用 sizeof 来计算数组大小