Official

B - Longest Uncommon Prefix Editorial by physics0523


競技プログラミングにおいて、問題の題意が問題文のみでは多少読み取りづらいような問題もあります。個人的にはこの問題もその一例だと思います。
そのような場合、サンプルの説明文を参照しましょう。問題の要求を理解することが簡単になることがあります。


制約が \(N \le 5000\) と小さいので、各 \(i\) に対して \(O(N)\) 回程度の計算量をかけてもよいことが分かります。
なので、以下のように素直にループを回す解法が成立します。

  • \(i=1,2,\dots,N-1\) について、以下を繰り返す。
    • \(j=1,2,\dots\) について、以下を繰り返す。
      • \(i+j > N\) のとき、 \(i\) に対する答えは \(j-1\) で確定する。
      • \(S_j = S_{j+i}\) のとき、 \(i\) に対する答えは \(j-1\) で確定する。
      • 上のどちらでもない場合、 \(j\) ループを続行する。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int n;
  string s;
  cin >> n >> s;
  for(int i=1;i<n;i++){
    for(int j=1;j<=n;j++){
      if(i+j>n){cout << j-1 << "\n";break;}
      if(s[j-1]==s[j+i-1]){cout << j-1 << "\n";break;}
    }
  }
  return 0;
}

posted:
last update: