acm poj 1226

Jophoenix 2010-11-04 12:08:30
这个程序有啥问题啊?
我思路是 找出最短的串,然后在最短的串里取字串和其他的串比较,这个代码不管输入什么都输出1 怎么个情况?
code:
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>
const int MAX = 110;
using namespace std;

string Rev(string s);

int main()
{
int tCase;
string str[MAX];
cin >> tCase;

while(tCase--)
{
int Cas,len;
string sRecord;
cin >> Cas;
len = MAX;
for(int i=0; i<Cas; ++i)
{
cin >> str[i];
if(str[i].size() <= len)
{
len = str[i].size();
sRecord = str[i];
}
}
while(len)
{
bool mark = false;
for(int k=0; k<sRecord.size()-len+1; ++k)
{
string str1,str2;
str1 = sRecord.substr(k,len);
for(int j=0; j<Cas; ++j)
{
str2 = Rev(str[j]);
if(string::npos != str[j].find(str1)
&& string::npos != str2.find(str1))
{
mark = true;
}
if(mark) goto end;
}
}
len--;
}
end: cout << len << endl;
}

return 0;
}

string Rev(string s)
{
string rs;
for(int i=s.size()-1; i>=0; --i)
{
rs += s[i];
}
return rs;
}
...全文
115 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jophoenix 2010-11-06
  • 打赏
  • 举报
回复
超时了~。。 = =
Jophoenix 2010-11-06
  • 打赏
  • 举报
回复
十分感谢~~
logiciel 2010-11-06
  • 打赏
  • 举报
回复
3楼中所说的第3个问题不存在,相应的错误修改导致超时。以下修改AC了。
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>
const int MAX = 110;
using namespace std;

string Rev(string s);

int main()
{
int tCase;
string str[MAX];
cin >> tCase;

while(tCase--)
{
int Cas,len;
int j_used; //加
string sRecord;
cin >> Cas;
len = MAX;
for(int i=0; i<Cas; ++i)
{
cin >> str[i];
if(str[i].size() <= len)
{
len = str[i].size();
sRecord = str[i];
j_used=i; //记录被比较的字符串下标
}
}
while(len)
{
for(int k=0; k<sRecord.size()-len+1; ++k)
{
bool mark = true;
string str1,str2;
str1 = sRecord.substr(k,len);
str2 = Rev(str1);
for(int j=0; j<Cas; ++j)
{
if (j==j_used) continue; //排除被比较的字符串
if(string::npos == str[j].find(str1) && string::npos == str[j].find(str2))
{
mark=false;
break;
}
}
if (mark) goto end;
}
len--;
}
end: cout << len << endl;
}
return 0;
}

string Rev(string s)
{
string rs;
for(int i=s.size()-1; i>=0; --i)
{
rs += s[i];
}
return rs;
}
logiciel 2010-11-05
  • 打赏
  • 举报
回复
有3个问题:
(1)判断要求在串的正向和反向中都出现,而题目要求只要在其中1个出现;
(2)在查找时没有排除被比较的串;
(3)一旦找到就输出结果,没有考虑可能还有更长的.

请参考以下修改(没有试过是否可AC):
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>
const int MAX = 110;
using namespace std;

string Rev(string s);

int main()
{
int tCase;
string str[MAX];
cin >> tCase;

while(tCase--)
{
int Cas,len;
int j_used, max_len=0; //加
string sRecord;
cin >> Cas;
len = MAX;
for(int i=0; i<Cas; ++i)
{
cin >> str[i];
if(str[i].size() <= len)
{
len = str[i].size();
sRecord = str[i];
j_used=i; //记录被比较的字符串下标
}
}
while(len)
{
bool mark = false;
for(int k=0; k<sRecord.size()-len+1; ++k)
{
string str1,str2;
str1 = sRecord.substr(k,len);
for(int j=0; j<Cas; ++j)
{
if (j==j_used) continue; //排除被比较的字符串
str2 = Rev(str[j]);
if(string::npos != str[j].find(str1)
|| string::npos != str2.find(str1)) //错 && string::npos != str2.find(str1))
{
//mark = true;
if (max_len < len) max_len = len; //记录最大的长度
}
//if(mark) goto end;
}
}
len--;
}
cout << max_len << endl;//end: cout << len << endl;
}

return 0;
}

string Rev(string s)
{
string rs;
for(int i=s.size()-1; i>=0; --i)
{
rs += s[i];
}
return rs;
}
Jophoenix 2010-11-04
  • 打赏
  • 举报
回复
http://poj.org/problem?id=1226
忘了加链接了。囧
Jinpo 2010-11-04
  • 打赏
  • 举报
回复
我不知道你写这个代码是干什么用的 但是不是总输出“1”:

如:
6
3
aaa
bbbb
aaaa


上述输出就是:3(而不是你说的总是1)


自己想弄清楚你想实现什么功能 再检查下你的代码实现

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧