1. 程式人生 > >HDU-4763

HDU-4763

HR 子串 log 一個 %d amp AC pos std

傳送門

T組字符串 問每個字符串中是否能找到一個子串在原串中互不重疊地出現三次(或以上),且該子串是原串的前綴、後綴。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;

const int maxn = 1e6 + 10;
char s[maxn];
int f[maxn];
int len;
int T;
bool vis[maxn];

void getFail(char* P, int* f) {
    f[
0] = 0; f[1] = 0; for (int i = 1; i < len; i++) { int j = f[i]; while (j && P[i] != P[j]) j = f[j]; f[i + 1] = P[i] == P[j] ? j + 1 : 0; } } int main() { scanf("%d", &T); while (T--) { scanf("%s", s); len = strlen(s); getFail(s, f);
int t = len; int ans = 0; memset(vis, 0, sizeof(vis)); while (t) { t = f[t]; vis[t] = 1; } for (int i = len; i ; i--) { int t = i; while (t) { if (vis[f[t]] && t >= 2 * f[t] && len - t >= f[t]) { ans
= max(ans, f[t]); } t = f[t]; } } printf("%d\n", ans); } return 0; }

HDU-4763