題目link:http://acm.hdu.edu.cn/showproblem.php?pid=1857
先簡述一下題目:
有一個RXC的字母矩形,R,C在500內,要匹配m個單詞,m在100000內,每個單詞長度不超過20,匹配方法為向右或者向下,或者右下,即三個方向,0度,90度,45度。
現在要輸出:如果匹配成功,輸出第一個字母的坐標,如果有多個匹配,輸出最左上的,如果不成功,輸出-1 -1。
如果你使用簡單的匹配,或者搜索,超時無限次,如果你字母矩陣構樹單詞構trie樹,必超內存,自己可以想想。
所以我也很無奈,這是我比賽時候遇到的一題,當時我開了這題,很無力……
這題目標志著我開始學習trie樹,經過兩天的思考,和參閱別人的思想,我們用逆向思維來做,以需匹配的單詞構樹(只有100000個),用字母矩陣來匹配,所以在插入的時候,我們給要匹配的單詞編號,用RR,CC數組來記錄對應單詞的坐標,初始化為0(我用的是0,也可以memset( ,-1, )),之後查找的時候,就傳入(行數+1,列數+1,)之所以加1,是因為想用0來表示沒成功匹配。我在trie裡寫了terminable,id(屬於第幾個單詞插入)屬性,在查找過程,只要遇到結點terminable,就比較是否記載過,沒記載過,就將RR[id],CC[id]標記為傳入參數r,c。最後順序輸出即可。
想清楚後,昨晚很自信地開始拍了,經過各種調試,總算過了sample了……馬上就提交了,這次終於沒有TLE了,且速度十分快……在c++提交是wa,在g++提交是RE。
這時候已經很夜了,我心想,先休息吧……
每次帶著問題休息,效果都會很差,想了很久,還是覺得沒問題,最後在郁悶與猜疑中睡去了.
今天醒來,發現了一個很基本的錯誤,我的數組開得太小了……改了一下,馬上就過掉了……!!!!