StringRotate[s_,r_]:=StringJoin[If[r>0,Identity,Reverse][{StringDrop[s,r],StringTake[s,r]}]]
CMWStep[rule_,slist_]:=Module[{r},Union[Flatten[Function[s,Table[(CMWStep1[#1,s,r]&)/@rule,{r,StringLength[s]}]]/@slist]]]
CMWStep1[p_Stringq_String,s_String,r_Integer]:=With[{n=StringLength[p],sp=StringRotate[s,r]},If[StringLength[sp]≥n&&StringTake[sp,n]==p,{StringRotate[q<>StringDrop[sp,n],-r]},{}]]
CMWEvolveList[rule_,init_List,t_Integer]:=NestList[CMWStep[rule,#1]&,init,t]
CMWStepT[rule_,slist_]:=Flatten[Module[{r},Function[s,({s,#1}&)/@Flatten[Table[(CMWStep1[#1,s,r]&)/@rule,{r,StringLength[s]}]]]/@slist],1]
CMWEvolveListT[rule_, init_List, t_Integer] := NestList[CMWStepT[rule, Union[Last /@ #]]&, {#, #}& /@ init, t]