POJ3461 Oulipo ——KMP算法——Pku3461

建议大家学一学比较巧妙的KMP算法吧,很有意思。推荐个题目:POJ3167 Cow Patterns 题解我会发在本博里。

这个KMP就木有什么好说的了吧,大家找百度百科学一下就可以了~

CODE

Program KMP;//By_Thispoet

Const 

	maxn=1000005;

Var

	st,s						:Ansistring;//st is long and s is short

	pre							:Array[-1..maxn]of Longint;

	i,k,p,q,ans,n				:Longint;

	

BEGIN



	readln(n);

	while n>0 do 

		begin

			readln(st);

			readln(s);

			pre[1]:=0;

			for i:=2 to length(st) do 

				begin

					k:=pre[i-1];

					while (k<>0)and(st[k+1]<>st[i]) do k:=pre[k];

					if st[k+1]<>st[i] then pre[i]:=0 else pre[i]:=k+1;

				end;

			

			p:=0;q:=0;ans:=0;

			while q<length(s) do 

				begin

					inc(q);

					while (p<>0)and(st[p+1]<>s[q]) do p:=pre[p];

					if st[p+1]=s[q] then inc(p);

					if p=length(st) then 

						begin

							inc(ans);

							p:=pre[p];

						end;

				end;

			writeln(ans);

			dec(n);

		end;

	

END.

你可能感兴趣的:(poj)