KMP模板(字符串匹配)

#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define mem(a) memset(a,0,sizeof(a))
typedef long long ll;
const int mod = 1e9+7;
const int maxn = 3e5+10;
using namespace std;



string str1[maxn];
string str2;
int next1[maxn];

int kmp(string str1,string str2);
void GetNext(string str);

int kmp(string str1,string str2){
    
    
    if((int)str2.length() <= 0||(int)str1.length() < (int)str2.length())
        return -1;
    int i1 = 0;
    int i2 = 0;
    GetNext(str2);
    while(i1 < (int)str1.length() &&i2 < (int)str2.length())
    {
    
    
        if(str1[i1] == str2[i2])
        {
    
    
            i1++;
            i2++;
        }else if(i2 == 0){
    
    
                i1++;
        }else{
    
    
            i2 = next1[i2];
        }
    }
    return i2 == (int)str2.length()?i1-i2:-1;
}


void GetNext(string str){
    
    
    memset(next1,0,sizeof(next1));
    next1[0] = -1;
    if((int)str.length() == 1)return;
    int i = 2;
    int cur = 0;//与i位置比较的位置
    while(i < (int)str.length())
    {
    
    
        if(str[i-1] == str[cur])
            next1[i++] = ++cur;
        else if(cur > 0)
            cur = next1[cur];
        else
            next1[i++] = 0;
    }
}

int main()
{
    
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42937838/article/details/104397755