更加精简的算法

#include<iostream>
#include<vector>
#include<algorithm>
#include<random>
#include<math.h>
using namespace std;

int KMP(string S, string T){
    // 求解 next 数组
    // 当前位置   前一个的 next 值
    int m = S.size(), n = T.size(), cur = 0, pre = -1;
    vector<int> next(n+1);
    next[0] = -1;
    while (cur < n) {
        if (pre == -1 || T[cur] == T[pre]) 
            next[++cur] = ++pre;
        else pre = next[pre];
    }

    // 两个字符串的下标
    int i = 0, j = 0;
    while(i < m && j < n){
        if(j == -1 || S[i] == T[j]) i++, j++;
        else j = next[j];
    }
    return j == n ? i - j : -1;
}

int getIndexOf(string S, string T){
    // 求解 T 是否为 S 的子串,若不是返回 -1   若是,返回起始下标
    if (T.size() > 0 && S.size() >= T.size() ) return KMP(S, T);
    else return -1;
}

string Manarcher(string p){
    // 马拉车算法, 求最长回文子串
    if(p.size() < 1) return 0;
    // 字符串预处理
    string str = "#";
    for(auto it:p) str = str + it + "#";

    // 回文半径辅助数组
    int arr[str.size()] = {0};
    // 最长回文中心  最长回文长度   当前回文中心   到达最右位置
    int max_c = 0, max_l = 0, cur_c = 0, cur_r = 0;
    for(int i=0; i<str.size(); i++){
        // 判断是否在区域里
        arr[i] = cur_r > i ? min(arr[2*cur_c - i], cur_r - i) : 0 ;
        while( i-arr[i]-1 >=0 && i+arr[i]+1 <= str.size() && str[i-arr[i]-1] == str[i+arr[i]+1] ) 
            arr[i]++;
        // 更新当前最大和最远
        cur_r < i + arr[i] ? cur_r = (cur_c = i) + arr[i] : 0;
        max_l < arr[i] ? max_l = arr[i], max_c = i : 0;
    }
    // max_l 为处理后字符串的半径, 即为原字符串的长度
    return p.substr((max_c - max_l)/2, max_l);
}




int main(){
    string S = "dfasaf", T = "asaf";
    int res = KMP(S, T);
    cout << res << endl;


    return 0;
}
#include<iostream>
#include<vector>
#include<math.h>
#include<sstream>
using namespace std;

int KMP(string& S, string& T){
    int len = T.size();
    // 求解 next 数组
    int next[len];
    next[0] = -1, next[1] = 0;
    // 当前位置   前一个的 next 值
    int cur = 2, pre = 0;
    while(cur < T.size()){
        if(T[cur-1] == T[pre]) next[cur++] = ++pre;
        else if(pre > 0) pre = next[pre];
        else next[cur++] = 0;
    }

    // 两个字符串的下标
    int Si = 0, Sj = 0;
    while(Si < S.size() && Sj < T.size()){
        if(S[Si] == T[Sj]) Si++, Sj++;
        else if(next[Sj] == -1) Si++;
        else Sj = next[Sj];
    }
    return Sj == T.size() ? Si - Sj : -1;
}

int getIndexOf(string& S, string& T){
    // 求解 T 是否为 S 的子串,若不是返回 -1   若是,返回起始下标
    if (T.size() > 0 && S.size() >= T.size() ) return KMP(S, T);
    else return -1;
}

int main(){
    string S,T;
    while(getline(cin, S)){
        getline(cin, T);
        vector<string> arr;
        string tem;
        stringstream ss(T);
        while(ss>>tem) arr.push_back(tem);
        bool flag = true;
        for(int i=0; i<arr.size(); i++)
            if(getIndexOf(S, arr[i]) == -1){
                cout<<"False"<<endl;
                flag = false;
                break;
            }
        if(flag) cout<<"True"<<endl;
    }
    return 0;
}