昨天在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上它给了我正确的输出。这段代码有什么问题?
答案 0 :(得分:0)
代码过于复杂,因为它需要做什么,如果它不是回文,你的代码会找到匹配的字两次,因此打印两次。你应该停止搜索找到第一场比赛。中断只会突破内环,外环将继续,它也会发现相反的情况。
答案 1 :(得分:0)
您没有为S2数组中的字符串保留空间。因此S2[i][k-j-1]=S1[i][j];
是UB,并且打印出的任何正确(或不正确!)答案都是纯粹的运气。