第11和第13样例TLE,萌新求助
查看原帖
第11和第13样例TLE,萌新求助
295285
vannb楼主2021/11/25 12:40

第11和第13样例的运行时间是1.20s,这该怎么优化

#include<bits/stdc++.h>
using namespace std;
 
int nextval[1000010];

void getNextval(string s2){
    int i = 0;
    int j = -1;
    nextval[0] = -1;
    int len2 = s2.length();
    while(i < len2){
        if(j == -1 || s2[i] == s2[j]){
            ++i;++j;
            nextval[i] = j;
        }
        else{
            j = nextval[j];
        }
    }
}

int KMP(int &i, int &j, string s1, string s2){

    int len1 = s1.length();
    int len2 = s2.length();
    

    while(i < len1 && j < len2){ 
        if(j == -1 || s1[i] == s2[j]){
            ++i;++j;
        }
        else{
            j = nextval[j];
        }
    }
    if(j >= len2){
        return i-j+1;
    }
    else{
        return -1;
    }
}

int main(){
    string s1, s2;
    cin>>s1;
    cin>>s2;
    int i = 0, j = 0;
    getNextval(s2);
    int len1 = s1.length();
    int len2 = s2.length();
    while(i < len1){
        int temp = KMP(i, j, s1,s2);
        if(temp != -1){
            printf("%d\n", temp);
            j = nextval[j];
        }
        else{
            break;
        }
    }
    for(int k = 1; k <= len2; k++){
        printf("%d ", nextval[k]);
    }

}
2021/11/25 12:40
加载中...