ac自動機入門題。。。。
然而我只想入門以防koi出題人送分(其實是智商硬傷)。。。yy一下感覺ac自動機還很正常然而寫起來就各種跪
顯然是用總的串數減去不可讀的串數。。。而不可讀串數就是ac自動機上走m步(從根出發),並且不經過任何乙個完整的可識別單詞的路徑數。
「不經過任何乙個完整的可識別單詞」就是說走的每個節點都不是結束節點,並且fail指標指向的也不是結束節點。(這就保證從根到這個節點上的路徑不包含完整的單詞)
把ac自動機建出來,然後在上面dp
f[i][j]表示走了i步,最後在自動機的j號節點上的路徑數。
1 #include2 #include3 #include4 #include5view codeusing
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 }
**跑得奇慢而且毫無可讀性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...