hdu 2243 考研路茫茫 單詞情結

2021-05-27 11:01:23 字數 2184 閱讀 8098

hdoj 2243

不僅僅是考研路茫茫 a此題的過程也是路茫茫 終於到最後柳暗花明了

a這個題用了3天 或者說用了1個月(因為1個月前就學了kmp和ac自動機)

雖然上個月那節課學了kmp匹配演算法+字典樹+ac自動機。 當時就聽得一頭霧水 特別是kmp那個失敗指標(或者說成是next fail...)

有那麼點點的抽象 聽完之後的水平當然是非常爛 只能做一些模板題或者拿模板做做題 稍微變一下的問題就不會了 關鍵還是對演算法理解不深 kmp都不會更不說ac自動機了

那節課後過了幾天 遇到一場吉林大學主辦的多校聯賽 其中有乙個題

旁邊幾個隊過得很快 我們隊題量少的弱點瞬間體現了出來 ac自動機不會啊(其實當時根本沒意識到是ac自動機能解決的...

然後此題終於a了 推了近4個小時的公式然後用矩陣加速過了 賽後聽同學討論ac自動機...什麼 有ac自動機?

那個題也是因為當時推出公式 後面就沒管了

最近重新粗淺地學了下字串匹配 理解比以前當然要深些了 至少ac自動機構造了解了點嘛

說說這道題吧

這個題意是給出乙個 n 和乙個l

然後給出n個單詞 求長度為l的小寫字母串中至少包含n個單詞中1個詞的串的個數(好像有點點繞口)

位址在這裡:

"至少"這中詞彙很敏感 可以從對立角度來想想.

就是先求出所有串的個數 然後減去乙個單詞都不包含的個數咯

所有串的個數就是26^1+26^2+...26^l次方

這個可以用乙個函式寫 這個多項式可以二分求解

我**裡是sum(x,n)函式 求x^1+x^2+...x^n

至於求乙個單詞都不包含的串的個數

這個就可以用到ac自動機了 ac自動機構建矩陣!

我當時很納悶 ac自動機不是解決字串匹配的嗎?(所以說不能老用模板a題,模板就是拿來匹配的)

然後就去找相關ac自動機構建矩陣的資料

這篇文章寫得很好 我也很感謝他 求乙個串中不包含單詞的辦法

看了上面那個 理解了很久 主要就是它那個矩陣 怎麼ans+=matrix[0][i]就是最後的答案 而且關於矩陣的傳遞閉包沒個概念

然後就經過了2天。。。(時間主要花在理解這個矩陣上面了)

尼瑪的我終於搞懂了 我們構造矩陣的方式不一樣 我的矩陣是轉置後乘右邊的乙個nx1向量 他是不轉置左邊乘乙個1xn向量

求乙個固定長度l不包含任何單詞的方法會了

只要理解了那個矩陣 hdu2243這個題就好辦了 因為這題就加了乙個求所有長度不包含然和單詞的串

只需要包矩陣多加一行一列就行了

這個可以自己去理解構造

然後這題一直timelimit

我無語了 我試了很大的資料 20億都是一瞬間出結果 再看人家交的**都是15ms  這題也不卡時間啊

然後又糾結了一下午 然後就發現這題有個資料就是2^31-1

因為矩陣我自己加了一行一列 然後矩陣求冥就是求(l+1)次方

l我用的int  然後l+1  然後就溢位啦 然後死迴圈。。。

我怎麼發現這個的?

因為2^31-2可以出資料 2^31-1 就不行了啊!!!!尼瑪啊

改過就a了!

這個時間花長了 不過理解也深了 與其粗淺地學很多演算法 不如深入地學一兩個演算法

最近不喜歡用vc了 老宕機 太爛的bug啊 不過斷點除錯又要用它。。。

#include#include#includeusing namespace std;

#define kind 26

#define maxn 33

#define ff(i,n) for(i=0;i>=1)

return r;

}struct node

}node[maxn];

int q[maxn<<1];

int head,tail;

int sz;

void init()

void insert(char *str)

p=node[p].next[index];

}node[p].end=1;

}void build_ac()

return ret;

}ull sum(ull x,int n)

int main()

build_ac();

sz+=2;

n=sz;

for(int i=0;i

HDU 2243 考研路茫茫 單詞情結

這道題和poj2778類似都需要利用end陣列和next陣列的特性構建狀態陣列,不過這裡是需要經過至少乙個目標串,而且長度是不小於l的,即需要長度為1 l時的種數和。然後我們可以求出總數後減去不經過目標串的和,剩下的就是我們要的答案。設總數的陣列為f n 當n為1時答案為26,n為2時為26 26 ...

hdu 2243 考研路茫茫 單詞情結

題目大意 問長度為1 n的串中包含了模式串的串總共有幾個。題目思路 求出長度不大於l的包含模式串的字串數,方法是改求不包含模式串的字串總數,當然先要處理出總的字串個數,可以用矩陣也可以用二分冪和的方法。而求不包含模式串的字串數同樣是構造矩陣,同時還要建立乙個虛結點,儲存長度小於l的不包含模式串的字串...

HDU2243 考研路茫茫 單詞情結

傳送門 to hdu 傳送門 to vj 考慮一位一位的加入字元,我們只在乎當前字串末尾的匹配情況。既然如此,我們用 acac ac自動機上的乙個節點來表示狀態就可以了。現在是乙個 dpdp dp轉移。似乎要儲存是否曾經出現過詞根?其實不用,只需要用所有情況減去一次都沒有出現過的情況即可。向量中加入...