poj3080

来源:互联网 发布:java 打印机api 编辑:程序博客网 时间:2024/05/02 02:07

忘了是看了哪位大哥的代码啦...就是暴力搜索....首先,我们先输入所有的字符串,保存起来...然后

1.我们再从第一个字符串中开始,从第一个字符串str中第一个位置开始截取长度为3的子串,保存为s

用s到其他字符串中查找,

2,然后从第一个字符串str中第二个.....到最后的每一个位置截取长度为3的子串,保存s然后查询,

3,这个时候我们查询完所有长度为3的子串了...

然后就是从第一步开始,截取长度为4...到60的子串....注意对于每个长度的子串都要像1,2,3步那样从不同的位置截取..下面是代码

#include<cstdio>#include<string>#include<iostream>using namespace std;int main(){int T,n;int i,j;string str[11];scanf("%d",&T);while(T--){scanf("%d",&n);for(i=0;i<n;i++)cin>>str[i];string ans;//这是用来存储结果的for(i=3;i<=60;i++)//截取子串从三开始,为什么呢?因为题目说小于3的子串就不用输出,所有从3开始{for(j=0;j<=60-3;j++)//这里是对于每个子串,从str[0]的不同位置开始截取,其实j<60-i也是可以的,因为子串就有i这么长,j是最后的要截取的开始位置{    bool flag=true;string s=str[0].substr(j,i);//这个函数的意思是从str[0]中下标j开始截取长度为i的子串for(int k=1;k<n;k++)//截取str[0]的子串,从str[1]开始查找if(str[k].find(s) == string::npos)//这是string的find函数,找不到就是这个返回string::npos{flag=false;break;}if(flag && s.size()>ans.size())//如果找到了,比较长度,选择长度大的ans=s;else if(flag && s.size()==ans.size() && s<ans)//如果长度相等,就看字典序大小ans=s;}}if(!ans.empty())printf("%s\n",ans.c_str());elseprintf("no significant commonalities\n");}return 0;}



原创粉丝点击