90 likes | 217 Views
10904: Structural Equivalence. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 10 9 0 4 : Structural Equivalence 解題者: 姜安璟 解題日期: 200 8 年 4 月 18 日 題意: 給格式為 type name = type 的測資,其中 name 是一個大寫英文字母, type 則可以由多種 type 組成。我們必須把 type 相同的資料分成同類並印出。
E N D
10904: Structural Equivalence • ★★★★☆ • 題組:Problem Set Archive with Online Judge • 題號:10904: Structural Equivalence • 解題者:姜安璟 • 解題日期:2008年4月18日 • 題意:給格式為type name=type的測資,其中name是一個大寫英文字母,type則可以由多種type組成。我們必須把type相同的資料分成同類並印出。 input: 每個test case由’-’分隔開來,’--’代表測資結束。 output: 每個testcase 由空行分隔開來。 不管是input、output,name都必須照字母順序排序。
題意範例: Sample Input: Sample Output: type A = int A B C type B = AR S W Z type C = intX Y type X = struct(A B) type Y = struct(B A) type Z = struct(A Z) type S = struct(A S) type W = struct(B R) type R = struct(C W) --
解法: ※成員個數表示當中有幾個type name 成員個數為0: type A = int0group1 type C = int0group1 *直接比對字串,相同設為同group。 成員個數為1: type B = A1 group1 *一個成員時,等於成員的group。
解法: 成員個數2以上: type X = struct(AB)2 type Y = struct(B A)2 *兩個type中,彼此對應相同typename的成員,扣除不比較。 扣除後: type X = struct()0 group2 type Y = struct()0 group2 *沒有需要比較的成員,相同group。
解法: type Y = struct(B A)2 group2 type Z = struct(A Z)2 扣除後: type Y = struct(B)1group2 type Z = struct(Z)1 group3 *擁有相同成員個數方可互相比較。 B、Z無法比較,因為成員個數(B = 1、Z = 2)。 因此,Y、Z屬不同group。
解法: type Z = struct(A Z)2 group3 type S = struct(A S)2 扣除後: type Z = struct(Z)1 group3 type S = struct(S)1 group3 *若剩下的成員彼此對應的剛好是自己,則因為前面能比的都相同,屬同group。
解法: type S = struct(A S)2 group3 type W = struct(B R)2 *無法扣除,則將成員個數相同的互相做比較。 發現A、B屬同個group,則將比對完的A、B扣除。 扣除後: type S = struct(S)1 group3 type W = struct(R)1 group3 比對S、R,因為R還未建group,所以我們必須把R展開發現前面的內容都和S相同,後面為recursive。那S、R為相同group。
解法: type W = struct(B R)2 group3 type R = struct(C W)2 扣除相同group的B、C後: type W = struct(R)1 group3 type R = struct(W)1 group3 *若剩下的成員彼此對應的剛好是對方,則因為前面能比的都相同,屬同group。
解法範例:無 • 討論: (1) 有沒有更好的方法? (2)group比對是不是可以更快? (3) 注意: 當成員個數不同時,必須展開至相同個數才能比對。