0528 Common Sub-String (共通部分文字列)

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0528
ある2つの文字列が与えられて,それの最長共通部分文字列の長さを答える問題.
空文字列は任意の文字列の共通部分文字列とし,空文字列の長さは 0 とする.


最初は最長共通部分文字列の長さに関して二分探索し,KMP 法でその長さの部分文字列が存在するかどうかチェックするコードを書いたけど TLE.
2つの文字列を s1, s2 とし,s2 の j 番目と s1 の j - i 番目から比較していくようなコードを書いたら通った.

#include <iostream>
#include <vector>
using namespace std;

int solve(const string& s1, const string& s2)
{
  int max_len = 0;
  for (int i = -int(s1.size()); i <= int(s2.size()); i++) {
    int len = 0;
    for (int j = max(i, 0); j < int(min(s1.size()+i, s2.size())); j++) {
      if (s1[j-i] == s2[j]) {
        len++;
        max_len = max(max_len, len);
      } else {
        len = 0;
      }

    }
  }
  return max_len;
}

int main()
{
  string s1, s2;
  while (cin >> s1 >> s2) {
    cout << solve(s1, s2) << endl;
  }
  return 0;
}