bzoj1030 JSOI2007 文字生成器

2022-03-30 13:43:24 字數 1315 閱讀 8376

ac自動機入門題。。。。

然而我只想入門以防koi出題人送分(其實是智商硬傷)。。。yy一下感覺ac自動機還很正常然而寫起來就各種跪

顯然是用總的串數減去不可讀的串數。。。而不可讀串數就是ac自動機上走m步(從根出發),並且不經過任何乙個完整的可識別單詞的路徑數。

「不經過任何乙個完整的可識別單詞」就是說走的每個節點都不是結束節點,並且fail指標指向的也不是結束節點。(這就保證從根到這個節點上的路徑不包含完整的單詞)

把ac自動機建出來,然後在上面dp

f[i][j]表示走了i步,最後在自動機的j號節點上的路徑數。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int sxt=10007;const

int maxn=66;const

int maxlen=103;7

8int fail[maxn*maxlen],ch[maxn*maxlen][26],dl[maxn*maxlen],tot,len,l,r;

9bool tag[maxn*maxlen];//

是結尾節點,或者fail指向結尾節點

10char

s[maxlen];

1112

int f[2][maxn*maxlen],pre,now;

13int

i,j,k,n,m,ans;

1415 inline void insert(int

len)

22 inline void

getfail() 32}

3334

intmain()

40for(i=1;i<=n;i++)

45getfail();

46 f[0][0]=1;47

for(i=1,now=1,pre=0;i<=m;i++,swap(now,pre))

48for(memset(f[now],0,(tot+1)<<2),j=dl[l=1];l<=r;j=dl[++l])if(!tag[j]&&f[pre][j])

49for(k=0;k<26;k++)

55for(i=0;i<=tot;i++)

56 ans-=f[pre][i],ans+=ans<0?sxt:0

;57 printf("

%d\n

",ans);

58return0;

59 }

view code

**跑得奇慢而且毫無可讀性qaq

BZOJ1030 JSOI2007文字生成器

比起前面hnoi的gt考試,貌似這題是多模式串。然後我滾去學ac自動機了。發現還是很好寫的。ac自動機部分見筆記 搞出自動機之後,f i j 表示自動機上第i個節點匹配到第j個字元不可讀文字的數量,然後自己yy一下轉移 include include include define n 10005 d...

bzoj1030 JSOI2007 文字生成器

傳送門 思路 直接算好像比較困難,所以考慮先算不可讀的串的個數,再拿總串數去減。不可讀的串的數量就是在ac自動機上走m步而不經過結尾節點 包括結尾點和fail指向結尾點的節點 的路徑條數。這個怎麼求呢?設f i j 表示走i步,現在在j號節點的路徑條數。那麼f i j 可以轉移f i 1 son j...

bzoj1030 JSOI2007 文字生成器

time limit 1 sec memory limit 162 mb submit 2891 solved 1193 submit status discuss jsoi交給隊員zyx乙個任務,編制乙個稱之為 文字生成器 的電腦軟體 該軟體的使用者是一些低幼人群,他們現在使用的是gw文字生成器v...