Một kiểu bản ghi (record type) được định nghĩa bởi một dãy có thứ tự các kiểu trường (tên trường không ảnh hưởng đến kiểu nên được lược bỏ khỏi đề bài này). Kiểu của một trường có thể là:
int, float, bool, string;X[n] (không khoảng trắng), với X là kiểu cơ sở và n là kích thước cố định;Hai kiểu bản ghi A và B được gọi là tương đương cấu trúc (structural equivalence) nếu khi "mở" đệ quy toàn bộ tham chiếu bản ghi lồng nhau về dạng chuẩn (chỉ còn kiểu cơ sở, kiểu mảng cơ sở, và cấu trúc lồng bản ghi), hai bản ghi có cùng số trường và tại mỗi vị trí, kiểu đã mở là giống hệt nhau về cấu trúc (một bản ghi lồng k trường không tương đương với chính kiểu của 1 trong các trường đó dù k=1, vì đó vẫn là hai tầng cấu trúc khác nhau).
Ví dụ: nếu Inner là bản ghi 1 trường kiểu int, và OuterA là bản ghi 1 trường kiểu Inner, còn OuterB là bản ghi 1 trường kiểu int, thì OuterA và OuterB không tương đương (một bên là bản ghi lồng bản ghi, một bên là trường int trực tiếp).
Dòng đầu là r — số kiểu bản ghi được định nghĩa (theo đúng thứ tự, bản ghi sau chỉ được tham chiếu tới bản ghi đã định nghĩa trước nó). r dòng tiếp theo, dòng thứ i dạng <Tên> <f> <field1> ... <fieldf> (f = số trường, mỗi field là một token duy nhất: kiểu cơ sở, X[n], hoặc tên một bản ghi đã định nghĩa trước). Dòng tiếp theo là q — số cặp cần so sánh. q dòng tiếp theo dạng <TênA> <TênB>.
In ra q dòng, mỗi dòng là EQUIVALENT hoặc DIFFERENT.
Ví dụ:
Đầu vào:
2
PointA 2 int int
PointC 2 int float
1
PointA PointC
Đầu ra:
DIFFERENT
Đầu vào:
2
PointA 2 int int
PointB 2 int int
1
PointA PointB
Đầu ra:
EQUIVALENT
Đang tải editor...