hdu_1358 kmp 求连续子串

来源:互联网 发布:js类数组和数组的区别 编辑:程序博客网 时间:2024/05/22 12:48


KMP算法 时间复杂度O(m+n)

这道题是练习KMP重要的 next 数组的好题

预处理数组 next[] ,第i位表示当匹配到此位置时下一位不匹配应该回复到的位置. 具体代码如下:

void Computer_Prefix_Funtion(string p,vector<int>& e){    int k=-1;    e[0]=-1;    for(int q=1;q<n;q++)    {        while(k>=0&&p[k+1]!=p[q])            k=e[k];        if(p[k+1]==p[q])            k++;        e[q]=k;    }} //p为待处理字符串,e为next数组

整体代码:

#include <iostream>#include <string>#include <vector>using namespace std;int n;void Computer_Prefix_Funtion(string p,vector<int>& e){    int k=-1;    e[0]=-1;    for(int q=1;q<n;q++)    {        while(k>=0&&p[k+1]!=p[q])            k=e[k];        if(p[k+1]==p[q])            k++;        e[q]=k;    }}int main(){    int j=0;    while(cin>>n&&n)    {        j++;        string p;        cin>>p;        cout<<"Test case #"<<j<<endl;        vector<int> e(n);        Computer_Prefix_Funtion(p,e);        for (int i=1;i<n;i ++)            if(!((i+1)%(i-e[i]))&& e[i]!= -1)                cout<<i+1<<" "<<(i+1)/(i-e[i])<<endl;        cout<<endl;    }    return 0;}


原创粉丝点击