CCCPaste

Untitled

#include 

using namespace std;
string text;

int * LPS(const string & subStr) {
    int n = subStr.size();
    int * lps = new int[n];
    
    int j = 0;
    lps[0] = 0;
    
    int i = 1;
    while(i < n) {
        if(subStr[i] == subStr[j]) {
            j++;
            lps[i] = j;
            i++;
        }
        else {
            if(j == 0) {
                lps[i] = 0;
                i++;
            }
            else {
                j = lps[j - 1];
            }
        }
    }
    
    return lps;
}
int * reverseLPS(const string & subStr) {
    int n = subStr.size();
    int * lps = new int[n];
    
    int j = 0;
//    lps[0] = 0;
//    
    for(int i = n - 2; i >= 0; i--) {
        while(j > 0 and subStr[i] != subStr[n - j - 1]) {
            j = lps[n - j];
        }
        if(subStr[i] == subStr[n - j - 1]) {
            j++;
        }
        lps[i] = j;
    }
    for(int i = 0; i < n; i++) {
        cout << lps[i] << " ";
    }
    return lps;
}
int* findAllSubStr(const string & subStr) {
    int * lps = LPS(subStr);
    int n = subStr.size();
    int * res = new int[n];
    int r = 0;
    
    int i = 0, j = 0;
    while(i < (int) text.size()) {
        if(text[i] == subStr[j]) {
            i++;
            j++;
            
            if(j == n) {
                res[r++] = i - j;
                cout << i - j << endl;
                j = lps[j - 1];
            }
        }
        else {
            if(j != 0) {
                j = lps[j - 1];
            }
            else {
                i++;
            }
        }
    }
    
    int *res_array = new int[r];
    for(int i = 0; i < r; i++) {
        res_array[i] = res[i];
    }
    
    return res_array;
}
int findFirstSubStr(const string & subStr) {
    int * lps = LPS(subStr);
    int n = subStr.size();
    
    int i = 0, j = 0;
    while(i < (int) text.size()) {
        if(text[i] == subStr[j]) {
            i++;
            j++;
            
            if(j == n) {
                return i - j;
            }
        }
        else {
            if(j != 0) {
                j = lps[j - 1];
            }
            else {
                i++;
            }
        }
    }
    return -1;
}
int findLastSubStr(const string & subStr) {
    int * lps = reverseLPS(subStr);
    int n = subStr.size();
    
    int i = text.size() - 1, j = n - 1;
    while(i >= 0) {
        if(text[i] == subStr[j]) {
            i--;
            j--;
            
            if(j == 0) {
                return i;
            }
        }
        else {
            if(j != n - 1) {
                j = lps[n - j - 1];
            }
            else {
                i--;
            }
        }
    }
    return -1;
}
int main() {
    text = "ABABABCABABC";
    string pat = "abcabcy";
    int p = findLastSubStr(pat);
    return 0;
}