为什么这个代码在ubuntu上运行得很好,而在Windows8上运行得不好

Why this code runs well on ubuntu and not in Windows 8?

本文关键字:运行 而在 Windows8 很好 ubuntu 为什么 代码      更新时间:2023-10-16

昨天在coci(克罗地亚公开信息竞赛)期间,我的第一项任务出现了问题,要求我从给定的密码列表中找到正确的密码正确的密码是可以在列表中以原始和反向顺序找到的密码。例如,如果单词"tulipan"是正确的密码,那么单词"napilut"也必须出现在列表中。

第一行输入包含整数N(1≤N≤100),即可能的密码数。以下N行中的每一行包含一个字,其长度为大于2且小于14的奇数。

输出的第一行也是唯一一行必须包含正确密码的长度及其中心字母。解决方案将是独一无二的。

So ex
input
4
las
god
psala
sal
output
3 a

也可以有一个回文单词ex:kisik,这将是正确的密码。

我的解决方案是以下代码

#include <iostream>
#include <string>

using namespace std;
int main()
{
int N,i,k,j,x,w;
cin >>N;
int lung[N];
string S1[N];
string S2[N];
bool trovata=false;
for(i=0; i<N; i++)
{
cin >> S1[i];
for(k=0; S1[i][k]!=''; k++);

for(j=0; j<k; j++)
{
S2[i][k-j-1]=S1[i][j];
}
S2[i][k]='';
lung[i]=k;
int conta=0;
for(j=0; j<k; j++)
{
if (S1[i][j]==S2[i][j]) conta++;
}
if(conta==k)
{
x=(k/2);
cout <<k<<" "<<S2[i][x];
trovata=true;
break;
}
}
if(trovata==false)
{
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
if(i!=j)
{
int conta=0;
if(lung[i]==lung[j])
{

for(w=0; w<lung[i]; w++)
{
if (S1[i][w]==S2[j][w]) conta++;
}
if(conta==lung[i])
{
x=(lung[i]/2);
cout <<lung[i]<<" "<<S2[i][x];
break;
}
}
}
}
}
}
return 0;
}

我在Windows 8上用CodeBlocks 13.12编译它,输出被写了两次(在第一个示例中,我的输出是"3 a3 a"而不是"3 a"),但当我在Ubuntu上运行的C::B上编译它时,它给了我正确的输出。这个代码出了什么问题?

代码对于它需要做的事情来说过于复杂,因为已经说过,如果它不是回文,你的代码会找到匹配的单词两次,因此会打印两次。您应该在找到第一个匹配项时停止搜索。中断只会中断内环,外环会继续,它也会找到相反的结果。

您没有在S2数组中为字符串保留空间。因此,S2[i][k-j-1]=S1[i][j];是UB,打印出的任何正确(或不正确!)答案都是运气使然。

相关文章: