HDU2087-剪花布条-KMP模板

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087

直接匹配,匹配到一组数据,模式串就从头开始匹配;

对这个理解依旧不是特别的深刻,总觉得还是很模糊;

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10005;
int Next[N];
string str,T;
void get_next(int m)            //  获得next数组;
{
    int i=0,j=-1;
    Next[0]=-1;
    while(i<m){
        if(j==-1 || T[i]==T[j]){            //  在和第一个字符匹配或者前面至少有一对字符相匹配时;
            i++,j++;
            if(T[i]!=T[j]) Next[i]=j;       //  如果在i的位置匹配失败,需要回到j这个位置;
            else Next[i]=Next[j];           //  如果在i的位置匹配失败,那么前面相同的也失效了,需要回到next[j]这个位置;(有点递归的意味)
        }else{
            j=Next[j];                      //  j直接回到前面的位置;
        }
    }
}
int KMP(int n,int m)
{
    int i=0,j=0,ans=0;
    while(i<n){
        if(str[i]==T[j]){       //  如果匹配成功:
            if(j==m-1){         //  找到完全匹配的主串,
                ans++;          //  统计计数+1;
                j=-1;           //  重新模式串匹配,i++,j从头开始;
            }
            i++;j++;
        }else{                  //  匹配失败了
            j=Next[j];          //  模式串往后移;
            if(j==-1) i++,j=0;  //  如果模式串已经移到了头,那么i++,模式串又从头开始;
        }
    }
    return ans;
}
int main()
{
    cin.sync_with_stdio(false);
    while(cin>>str){
        if(str=="#") break;
        cin>>T;
        get_next(T.size());
        //  for(int i=0;i<T.size();i++) cout<<"  "<<Next[i]<<"  ";  测试next数组;
        cout<<KMP(str.size(),T.size())<<endl;
    }
    return 0;
}


你可能感兴趣的:(字符串,KMP)