Theme Section HDU - 4763

題目傳送門

題意:給你一個字符串,你在這個字符串中間找一個最長的字串,可以和開頭和結尾相同。

思路:這個題還是比較暴力的,直接KMP和枚舉就可以了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

#define MAXN 1010000
#define MAXE 100
#define INF 1000000000
#define MOD 10001
#define LL long long
#define ULL unsigned long long
#define pi 3.14159

using namespace std;

int nex[MAXN];
bool vis[MAXN];
string str;
int n, m;
int max_length;

void get_nex() {
    memset(nex, 0, sizeof(nex));
    for (int i = 1, j = 0; i < n; ++i) {
        while (j && str[i] != str[j]) {
            j = nex[j];
        }
        if (str[i] == str[j]) {
            j++;
        }
        nex[i + 1] = j;
    }
}

void KMP(int pos, int l) {
    for (int i = pos, j = 0; i < l; i++) {
        while (j && str[i] != str[j])
            j = nex[j];
        if (str[i] == str[j])
            j++;
        if (j > m)
            return;
        if (j > max_length)
            max_length = j;
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    int T;
    cin >> T;
    for (int kase = 1; kase <= T; ++kase) {
        cin >> str;
        n = (int) str.length();
        if (n < 3) {
            cout << 0 << endl;
        } else {
            get_nex();
            memset(vis, false, sizeof(vis));
            max_length = 0;
            for (int i = min(nex[n], n / 3); i >= max_length && i >= 1; --i) {
                m = i;
                KMP(i, n - i);
            }
            cout << max_length << endl;
        }
    }
    return 0;
}



發佈了130 篇原創文章 · 獲贊 25 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章