杭电 1238
//杭电1238题:求最长公共子串
//思路:使用string中的相应方法
//教训:特别要注意临界条件
#include <string>
#include <iostream>
#include <stdio.h>
#include <algorithm> //引入algorithm类
using namespace std;
bool cmp(string a,string b) //定义sort的谓词
{
return a.size()<b.size();
}
string reversestr(string str)
{
int i=0;
int j=str.size()-1;
char c;
while(i<j)
{
c = str[j];
str[j] = str[i];
str[i] = c;
i++;
j--;
}
return str;
}
int main()
{
//freopen("2.txt","r",stdin); //使用freopen重定义输入输出流,头文件是stdio.h
int t;
cin>>t;
for(int i=0;i<t;++i)
{
int num;
string str[101];
int n;
cin>>n;
for(int j=0;j<n;++j)
{
cin>>str[j];
}
sort(str,str+n,cmp); //调用algorithm中的sort函数,注意第二个参数加的是n,指向的是最后一个元素的下一个位置
int minsize = str[0].size();
string substring;
string resubstr;
for(int i1=minsize;i1>0;i1--) //提取字符个数
{
bool isSub = false;
for(int i2=0;i2<minsize;++i2) //起始位置
{
if(i1+i2>minsize)
break;
substring = str[0].substr(i2,i1);
resubstr = reversestr(substring);
for(int i1=1;i1<n;++i1)
{
if(str[i1].find(substring)>str[i1].size() && str[i1].find(resubstr)>str[i1].size())//使用algorithm中的find函数
{
break;
}
}
if(i1==n)
{
isSub = true;
break;
}
}
if(isSub)
{
cout<<i1<<endl;
break;
}
}
//特别要注意一个也不成功的情况
if(i1==0)
cout<<0<<endl;
}
//fclose(stdin);
return 0;
}