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轉移。似乎要儲存是否曾經出現過詞根?其實不用,只需要用所有情況減去一次都沒有出現過的情況即可。向量中加入...