牛客網 NC207429 最大值 KMP

1. 題目描述

1.1. Limit

Time Limit: C/C++ 1秒,其他語言2秒

Memory Limit: C/C++ 262144K,其他語言524288K

1.2. Problem Description

有一個字符串 ss,對於字符串中一個非前綴子串恰好爲字符串的前綴我們稱之爲ac串。

請問給出一個字符串他的ac串最大長度爲多少。

1.3. Input

輸入數據第一行是 tt,表示數據的組數,接下來每組數據輸入一個字符串 st10s1e5s(t \le 10,s \le 1e5)

1.4. Output

輸出最大長度

1.5. Sample Input

2
aaaaa
abacc

1.6. Sample Output

4
1

1.7. Note

aaaab的ac串是aaa(2:4)

acac的ac串是ac(3:4)

1.8. Source

牛客網 NC207429 最大值


2. 解讀

我們有了一個輸入字符串 ss,設其非前綴子串爲 xxxs[1:size(s)]x \in s[1:size(s)],其中 size(s)size(s) 爲字符串 ss 的長度,[a:b][a:b] 爲左閉右開區間。這道題目想要求的是最大長度的非前綴子串 xx,滿足 s[0:size(x)]==xs[0:size(x)] == x

這恰好就類似於 KMP算法nextnext 數組 的定義。

next[i]=k next[i] = k

其中 ii 表示我們要判斷的是字符串ss 的長度爲 i+1i + 1 的子串 m=s[0:i+1]m = s[0:i + 1]kk 表示 mm 的前 kk 個字符組成的子串與後 kk 個字符組成的非前綴子串相等,即

m[0:k]==m[size(m)k:size(m)] m[0:k] == m[size(m) - k:size(m)]

size(m)k>0 size(m) - k > 0

例如 aaaabnextnext 數組爲 {0,1,2,3,0}\{0, 1, 2, 3, 0\},題目要求的ac串就是 nextnext 數組中的最大值對應的字符串,也就是aaa

推薦一個 KMP算法的可視化網站,裏面還有各種算法的可視化,可以幫助理解。

3. 代碼

#include <algorithm>
#include <iostream>
using namespace std;

const int MAXN = 1e5 + 1;

int Next[MAXN] = { 0 };

int getNext(string p, int length)
{
    Next[0] = 0;
    Next[1] = 0;
    for (int i = 1; i < length; i++) {
        int j = Next[i];
        while (j && p[i] != p[j]) {
            j = Next[j];
        }
        Next[i + 1] = (p[i] == p[j]) ? j + 1 : 0;
    }
    return 0;
}

int main()
{
    int t, maxN;
    string str;
    cin >> t;
    while (t--) {
        cin >> str;
        maxN = 0;
        getNext(str, str.size());
        for (size_t i = 1; i <= str.size(); i++) {
            maxN = max(Next[i], maxN);
        }
        cout << maxN << endl;
    }
}


聯繫郵箱[email protected]

CSDNhttps://me.csdn.net/qq_41729780

知乎https://zhuanlan.zhihu.com/c_1225417532351741952

公衆號複雜網絡與機器學習

歡迎關注/轉載,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章