KMP 字符串匹配

求字符串 AA 在字符串 BB 中的每次出现的位置。

变量

  • int\text{int} nxt[i]:字符串的前缀函数数组。
  • int\text{int} f[i]:以 bib_i 为开头的字符串能与 AA 匹配的最大字符数。

函数

  • void\text{void} qnext(string a):求 AA 的字符串的前缀函数数组,a0l11a_{0\sim l1-1} 的结果分别对应 nxt1l1nxt_{1\sim l1}
  • void\text{void} qf(string a,string b):求字符串 AA 在字符串 BB 中的每次出现的位置,b0l21b_{0\sim l2-1} 的结果分别对应 f1l2f_{1\sim l2}
struct KMP{
	int nxt[N],f[N];
	void qnext(string a)
	{
	    int l1=a.size();
	    for(int i=1,j;i<l1;i++)
	    {
	        j=nxt[i];
	        while(j&&a[j]^a[i])
				j=nxt[j];
			nxt[i+1]=(a[i]^a[j]?0:j+1);
	    }
	}
	void qf(string a,string b)
	{
	    int l1=a.size(),l2=b.size();
	    for(int i=0,j=0;i<l2;i++)
	    {
	        while(j&&a[j]^b[i])
				j=nxt[j];
			if(!(a[j]^b[i]))
				j++;
			f[i]=j;
			if(!(f[i]^l1))
				cout<<i-l1+2<<endl;
	    }
	}
};
posted @ 2022-02-25 12:47  luckydrawbox  阅读(8)  评论(0)    收藏  举报  来源