intさわだんのBlack History

刹那的レジェンドになりたい。

第7回日本情報オリンピック 本選 「共通部分文字列」

解法は顕著。


もし文字a[i] == b[j]だったらdp[i][j] = dp[i-1][j-1] + 1;をすることによって連続する文字列を求める。常にdp[i][j]の値をチェックし、最大のものが解。

計算量はO(N^2).

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[4003][4003] = {0};
int main(){

  
  char a[4002],b[4002];
  
  while(cin >> a >> b){
  int ans = 0;
  memset(dp,0,sizeof(dp));

  int alen = strlen(a);
  int blen = strlen(b);
  
  for(int i = 1;i <= alen;i++){
    for(int j = 1;j <= blen;j++){
      if(a[i-1] == b[j-1]){
	dp[i][j] = dp[i-1][j-1] + 1;
	ans = max(ans,dp[i][j]);
      }
    }
  }

  printf("%d\n",ans);
  
  }
  
  return 0;
  
}