程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU1857題解(逆向思維trie)

HDU1857題解(逆向思維trie)

編輯:C++入門知識

題目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。

這時候已經很夜了,我心想,先休息吧……

每次帶著問題休息,效果都會很差,想了很久,還是覺得沒問題,最後在郁悶與猜疑中睡去了.

今天醒來,發現了一個很基本的錯誤,我的數組開得太小了……改了一下,馬上就過掉了……!!!!

View Code

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved