No, they don't have to be the same. Usually they are, but with a little work you can handle this. Not sure you should though. One of the nice things (to me anyway) is that if something happens and a subscriber gets out of sync, I just blow away the table and repopulate - as described below. This only applies to replicated tables - you can have all the other objects you want.
The replication wizard will handle the export/import for you. Basically it scripts out all objects being replicated, bcps the data out, then applies the scripts to the subscriber and bcps the data back in - this is the initial 'snapshot'.