dfa 最小化的一个丐版实现
https://shanlunjiajian.github.io/2023/05/21/dfa-tech/
好像是叫 moore 算法,一个 vector
代表一个等价类,col
是所属等价类,这个是初始的时候 accept 状态放在一个等价类里,reject 状态放在一个等价类里,其余状态放在一个等价类里。对每种出边检查同一等价类的此类出边是否指向了不同等价类,根据指向的等价类的不同进行分裂。
while(1){
int lac=cct;
for(int o=0;o<m;o++){
for(int i=1;i<=lac;i++)if(vec[i].size()>1){
int tmp=cct;
for(auto j:vec[i]){
int go=col[tr[j][o]];
if(!vis[go])
vis[go]=++cct;
vec[vis[go]].pb(j);
}
for(auto j:vec[i])vis[col[tr[j][o]]]=0;
vi().swap(vec[i]);
swap(vec[i],vec[cct]);--cct;
for(auto j:vec[i])col[j]=i;
for(int t=tmp+1;t<=cct;t++)
for(auto j:vec[t])
col[j]=t;
}
}
if(cct==lac)break;
}