[BZOJ 1030] 텍스트 생 성기 AC 자동 동기 + DP
코드:
const
maxn=6000;
maxm=105;
md=10007;
var
n,m,i,tot,ans:longint;
trie:array[0..maxn,'A'..'Z']of longint;
fail:array[0..maxn]of longint;
s:ansistring;
f:array[0..maxm,0..maxn] of longint;
place:array[-1..26*maxn]of boolean;
procedure ins(s:ansistring);
var
i,len,p:longint;
begin
p:=0;
len:=length(s);
for i:=1 to len do
begin
if trie[p,s[i]]=0 then begin inc(tot); trie[p,s[i]]:=tot; end;
p:=trie[p,s[i]];
end;
place[p]:=true;
end;
procedure getac;
var
i,head,tail,x:longint;
dl:array[0..26*maxn]of longint;
ic:char;
begin
head:=1;
tail:=1;
dl[1]:=0;
while head<=tail do
begin
x:=dl[head];
for ic:='A' to 'Z' do
if trie[x,ic]>0 then
begin
inc(tail);
dl[tail]:=trie[x,ic];
if x<>0 then fail[trie[x,ic]]:=trie[fail[x],ic];
end
else if x<>0 then trie[x,ic]:=trie[fail[x],ic];
place[x]:=place[x]or place[fail[x]];
inc(head);
end;
end;
procedure solve;
var
i,j,all:longint;
ic:char;
begin
f[0,0]:=1;
for i:=1 to m do
for j:=0 to tot do
if place[j]=false then
for ic:='A' to 'Z' do
f[i,trie[j,ic]]:=(f[i,trie[j,ic]]+f[i-1,j])mod md;
ans:=0;
for i:=0 to tot do
if place[i]=false then ans:=(ans+f[m,i])mod md;
all:=1;
for i:=1 to m do all:=(all*26) mod md;
writeln((all-ans+md)mod md);
end;
begin
tot:=0;
fillchar(place,sizeof(place),false);
fillchar(trie,sizeof(trie),0);
fail[0]:=-1;
readln(n,m);
for i:=1 to n do
begin
readln(s);
ins(s);
end;
getac;
solve;
end.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.