Упрощение... пока не последнее. А так почти наигрался ж) Ещё немного раздумий про суфиксный ДАГ и всё....
![](http://ic.pics.livejournal.com/digital333/24275157/2658/2658_600.png)
http://vk.com/doc10874142_242547033 --- на закуску. Add() без предварительной Split процедуры:
void Add(const char *txt)
{
Add(root,txt,false);
}
void Merge(State *st,State *st1,char sym)
{
State *st2=reg.Get(st1);
if(st2) {
SetLink(st,sym,st2);
reg.Del(st1);
DelState(st1);
}
}
State *Add2(State *st,const char *txt,bool dup)
{
char sym=*txt++;
reg.Del(st);
if(sym) {
State *s=st->get(sym);
if(s) {
if(s->in>1) dup=true;
if(dup) s=DupState(s);
} else s=NewState();
s=Add2(s,txt,dup);
SetLink(st,sym,s);
Merge(st,s,sym);
} else st->fin=true;
return reg.Add(st);
}