LCPを見るだけ。
接尾辞配列の構築みたいなことをする。
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int S = 5000 + 1;
char s[S];
bool cmp(int a, int b)
{
return strcmp(s + a, s + b) < 0;
}
int main(void)
{
int idx[S];
int tc;
cin >> tc;
while (tc--) {
cin >> s;
int size = strlen(s);
s[size++] = '$';
for (int i = 0; i < size; ++i) {
idx[i] = i;
}
sort(idx, idx + size, cmp);
// for (int i = 0; i < size; ++i) {
// cout << (s + idx[i]) << endl;
// }
int mx = 0;
for (int i = 0; i+1 < size; ++i) {
int cnt = 0;
while (s[idx[i] + cnt] == s[idx[i + 1] + cnt]) ++cnt;
mx = max(mx, cnt);
}
cout << mx << endl;
}
return 0;
}