为什么这个代码在ubuntu上运行良好而在Windows 8中运行不正常?

时间:2014-02-16 09:58:38

标签: c++ codeblocks

昨天在coci期间(CROATIAN OPEN COMPETITION in INFORMATICS)我遇到了第一个任务问题,要求我从给定的密码列表中找到正确的密码, 正确的密码是可以在列表中以原始顺序和反向顺序找到的密码。例如,如果单词“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]!='\0'; k++);


    for(j=0; j<k; j++)
    {
        S2[i][k-j-1]=S1[i][j];
    }
    S2[i][k]='\0';
    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编译它并且输出被写入两次(在第一个ex中我输出“3 a3 a”而不是“3 a”)但是当我在C :: B上运行它时在Ubuntu上它给了我正确的输出。这段代码有什么问题?

2 个答案:

答案 0 :(得分:0)

代码过于复杂,因为它需要做什么,如果它不是回文,你的代码会找到匹配的字两次,因此打印两次。你应该停止搜索找到第一场比赛。中断只会突破内环,外环将继续,它也会发现相反的情况。

答案 1 :(得分:0)

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