·你的目的就是要讓編碼有歧義,這就美妙了。
·英文題,述大意:
給出n個模板字串,詢問是否存在乙個字串,使得用模板串(隨便你用多少個)來拼湊這個串,能夠至少有兩種拼法。如果有,就輸出「有」。
·分析:
值得注意的是,n的範圍不太大(0
如果直接思考如何拼湊,那麼就是乙個典型的搜尋列舉思想,對於這道題來說,也是乙個典型的**超時思想。不過,如果擁有乙個好的習慣,你會不禁想到:正著不行反著來。所以,我們考慮對於乙個串,把它切成幾塊,並使得每塊都屬於模板串。如果有兩種切法,那麼就可以輸出「yes」了。
比如這樣:
·目的明確。對於乙個串,我們將其切割,我們在將這樣的狀態重畫一遍:
·玩著玩著,我們意識到:分成的小段一定是屬於模板串的。所以考慮用模板串去填出大串(逆向思維已經貢獻了它的全部加值,現在應該回來了)。
·分析一類簡單情況,如圖,我們要拼湊滿足條件的大串:
·首先會拿上面兩個模板串,就拼出了大串。然後你會拿下面兩個模板串再來拼乙個一樣的大串,然後就可以輸出「yes」了。
·在反覆拼湊的過程中,得到一些結論:
①每種拼法每乙個位置上的字母上一樣的(不要忽視)
②不同的拼法,所使用模板串時,發現只有部分重疊(相同)的模板串能夠在靠近的位置,如圖:
·可以看見,紅串綠串有公共字首,在不同拼法中起點相同;黃串與藍串有公共字尾,在不同拼法中終點相同;紅串與黃串的關係是:紅串的乙個字尾等於黃串的乙個字首,它們在不同拼法中收尾相接(部分重疊)。你可以在冥冥之中感受到,兩種拼湊方式是有聯絡的,即這個串可能會「指導」另乙個串的合成。
·神秘跳跳方法解決問題。我們用這樣的順序,來搭建這兩個串:(結合上圖吧)先在上面放置乙個綠串,然後在模板中尋找字首與它相同的串來搭建下面的串,於是找到了紅串,將紅串放置。現在紅串伸出去了一截,在模板中尋找字首與這一截相同的串,找到黃串,放在上面。現在黃串伸出去了一截,在模板串中尋找字首與這一截相同的串,找到藍串,放置藍串於下方。發現沒有那個伸出去一截了,也就是說,當前拼的大串,我們已經找到有兩種拼法了。
·總結規律:只要還伸出去了一截,我們就永不停息,直到沒有伸出的一截。說句老實話,找不到就是找不到,還是要停息的(不停息的現實意義就是超時)。
·方法:列舉兩兩模板串,並記錄乙個模板串的第i位開始,可以接上(即上文的相同)另乙個串的開頭(舉例子就是紅串的第6位開始可以接上黃串)。怎樣表示關係呢?就建邊把,將每乙個模板串的每一位看成乙個節點,然後就搭建有向邊(比如紅串第6位可一建一條邊通向黃串第5位)。什麼時候結束呢,如果從某個串i位到末尾就完全等於乙個另乙個模板串(就像上文黃串與藍串的關係一樣),就說明不會冒出一截了,也就是找到答案。
·**(防水的)浮出水面:
1 #include2 #include3我無法忘記故鄉秋末的麥地,和南方水柳搖擺的倩影。——————汪峰《雨天的回憶》#define go(i,a,b) for(int i=a;i<=b;i++)
4#define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
5const
int n=110;struct ee[n*300];6
int t,x,n,m,len[n],sz,id[n][30],head[n*30],k,over;char s[n][30];bool vis[n*30
],can;
7void add(int u,int v);head[u]=k++;}
8void dfs(int u)}
9int main()vis[sz+1]=0;13
14 go(a,1,x)}}
21 go(i,1,x)
22 printf("
case #%d:
",++t);puts(can?"
ambiguous.
":"not ambiguous.");
23 }return
0;}//
paul_guderian
UVA 木塊問題 101
uva 木塊問題 101,好開森好開森。雖然花了很長時間,不過能一次就ac也是蠻開心的,用c 寫效率就是不錯 疊木塊其實是乙個二維空間,每個木塊都有縱橫座標 include include includeusing namespace std block用於記錄木塊所在位置,x是位於哪一疊木塊,y是...
UVA 非常可樂
include include include include include using namespace std struct node int vis 205 205 注意vis陣列用於 int s,n,m int cup left 3 記錄三個杯子中每個杯子的剩餘狀態 int bfs fo...
UVa百題總結
總算刷夠 演算法競賽入門經典 100題了,就像教主所說,有了練acm的誠意,受自身水平和眼界所限,這總結難免會有一些個人色彩和不正確的地方,大牛勿噴。另外我的文筆可能極其拙劣,將就著看吧。按照教主的進度安排,最理想的情況是寒假學完前八章,下學期開始學動態規劃 數學和圖論的基礎,為暑假集訓打下基礎。暑...