# 【NOIP2013模拟】归途与征程 题解+代码

aaaa
aaaa

a*a
aaaaaa

* a*b*c *
abacabadabacaba

4

6

15

## Solution

30%随便爆搜
80%发现O(n3)$O(n^3)$甚至更多一点都能过，那么就准备好有一点水准的暴力

100%

B已经被复制。
A串被$*$分割之后，从1开始给每个小字符串标号。用一个预处理F[i,j]表示字符串B从i这个字符之后，第j个小字符串最早从B串的哪个位置开始。那么每次就只用跳到对应的位置就行了，如果已经跳过了n个位置，却还没有把所有小字符串做完，就不可行。单次匹配时间复杂度降为O(m)$O(m)$

## Code

var
n,i,j,k,kk,ans,m,l,q,jy,jy2:longint;
t,s,s1:ansistring;
ch:char;
bz,bz2:boolean;
next,long:array[1..110] of longint;
a:array[1..200020,1..110] of longint;
procedure getnext(s:ansistring);
var
i,j,n:longint;
begin
n:=length(s);j:=0;
for i:=2 to n do
begin
while (j>0)and(s[i]<>s[j+1]) do j:=next[j];
if (s[i]=s[j+1]) then inc(j);
next[i]:=j;
end;
end;
procedure kmp(s:ansistring;k:longint);
var
m,i,j:longint;
begin
j:=0;m:=length(s);
for i:=2 to 2*n do
begin
while (j>0)and(t[i]<>s[j+1]) do j:=next[j];
if (t[i]=s[j+1]) then inc(j);
if j=m then begin a[i-long[k]+1,k]:=i-long[k]+1;j:=next[j];end;
end;
end;
begin
readln(s);readln(t);
m:=length(s);n:=length(t);t:=t+t;s:=s+'!';t:=t+'@';i:=1;kk:=0;
while i<=m do
begin
s1:='';while (s[i]='*')and(i<=m) do inc(i);
while (s[i]<>'*')and(i<=m) do begin s1:=s1+s[i];inc(i);end;
if (i<=m) then
begin
fillchar(next,sizeof(next),0);getnext(s1);
inc(kk);long[kk]:=length(s1);kmp(s1,kk);
end;
end;
for i:=1 to kk do
begin
for j:=2*n downto 1 do
begin
if (j=2*n)and(a[j,i]=0) then a[j,i]:=2*n+1;
if a[j,i]=0 then a[j,i]:=a[j+1,i];
end;
end;
for i:=1 to n do
begin
bz:=true;
j:=1;k:=i;q:=kk;l:=i+n-1;
if (s[m]<>'*') then
begin
while (s[m+l-i-n+1]<>'*')and(l>=k) do
begin
if s[m+l-i-n+1]=t[l] then dec(l)
else begin bz:=false;break;end;
end;
dec(q);
end;
if (s[1]<>'*') then
begin
while (s[k-i+1]<>'*')and(k<=l) do
begin
if s[k-i+1]=t[k] then inc(k)
else begin bz:=false;break;end;
end;
inc(j);
end;
if bz=false then continue;
while (j<=q)and(k<=l) do
begin
k:=a[k,j]+long[j];inc(j);
end;
if (bz)and(j>q)and(k<=l+1) then inc(ans);
end;
writeln(ans);
end.


#### JZOJ 3498【NOIP2013模拟联考14】图形变换

2015-10-01 09:26:04

#### 【NOIP2013模拟】七夕祭

2016-04-09 15:03:29

#### 【NOIP2013模拟】KC看星

2016-05-18 20:40:06

#### 【NOIP2013模拟】水叮当的舞步

2016-06-03 19:09:03

#### 【NOIP2013模拟】粉刷匠

2016-05-30 19:37:33

#### 大暴搜 [BZOJ3303] 太鼓达人

2017-08-13 21:45:16

#### 【NOIP2013模拟联考3】山峰(summits)

2016-07-08 16:18:46

#### 【NOIP2013模拟联考5】军训(training) 题解+代码

2016-06-29 19:17:22

#### 【NOIP2013模拟】归途与征程

2016-05-30 19:46:03

#### JZOJ3427. 【NOIP2013模拟】归途与征程 （2017.8B组）

2017-08-17 22:36:18