算法思想来自:http://blog.youkuaiyun.com/shaohui/archive/2006/06/09/784577.aspx
// 求两字符串最大公共子串 from:http://blog.youkuaiyun.com/shaohui/archive/2006/06/09/784577.aspx

/**//*
s1 = "abcdefg", s2 = "klmncdf"
abcdefg | abcdefg | abcdefg | abcdefg
klmncdf | klmncdf | klmncdf | klmncdf
s1慢慢滑过s2

*/
#include<iostream>
#include<string>
using namespace std;

// 返回最大公共子串长度
int bigsubstring(const string &str1, const string &str2)

...{
int len1 = str1.length(), len2 = str2.length(), len = len1 + len2;
int cnt, idx; // 迭代量
int curmax, max; // curmax:当前公共子串最大长度,max:要返回的最大公共子串长度
int s1start, s2start; // 两字符串开始遍历的位置

max = 0;
for(cnt = 0; cnt < len; ++cnt)

...{
s1start = 0;
s2start = 0;

if(cnt < len1)
s1start = len1 - cnt;
else
s2start = cnt - len1;

curmax = 0;
for(idx = 0; (s1start + idx < len1) && (s2start + idx < len2); ++idx)

...{
if(str1[s1start + idx] == str2[s2start + idx])
curmax++;
else

...{
max = (curmax > max) ? curmax : max;
curmax = 0;
}
}

max = (curmax > max) ? curmax : max;
} // 1st for

return max;
}

int main()

...{
string s1, s2;

cin >> s1 >> s2;

cout << bigsubstring(s1, s2) << endl;

return 0;
}