• DFA Minimization


    有点晚了我就不调试了..不过说是这么说我还是过了编译的..

    #include<bits/stdc++.h>
    using namespace std;
    namespace DFA{
       const int alp=10;
       struct Node{int t[alp],a;Node(){}Node(int tx,int ac):a(ac){for(int i=0;i<alp;++i)t[i]=tx;}};
       struct DFA{
          vector<Node>nodes;
          int starting;
          int crt(int ac=0){nodes.emplace_back(nodes.size(),ac);}
          void ss(int s){starting=s;}
          void st(int s,int c,int t){nodes[s].t[c]=t;}
          void sa(int s,int a){nodes[s].a=a;}
       };
       int _C_u_dd(vector<int>&a,const DFA&tt,int pos,int up){
          a[pos]=up++;
          const Node&g=tt.nodes[pos];
          for(int i=0;i<alp;++i)if(!a[g.t[i]])
             up=_C_u_dd(a,tt,g.t[i],up);
          return up;
       }
       int Cut_unreachable(DFA&cc,const DFA&tt){
          cc.nodes.clear();
          vector<int>z;
          z.resize(tt.nodes.size());
          int gr=_C_u_dd(z,tt,tt.starting,1);
          cc.nodes.resize(gr);
          for(int i=0,_=tt.nodes.size();i<_;++i)if(z[i]){
             const Node&p=tt.nodes[i];
             Node&q=cc.nodes[z[i]];
             q.a=p.a;
             for(int i=0;i<alp;++i)
                q.t[i]=z[p.t[i]];
          }cc.ss(1);
          return gr-1;
       }
       namespace PRS{
          struct q{
             vector<int>son;int tid,in;
             q(int sz=0):tid(-1){if(sz)son.resize(sz);}
          };
          typedef pair<int,int>o;
          struct p{
             vector<q>z;
             vector<o>b;
             p(int t){
                z.emplace_back(t);
                b.resize(t+1);
                for(int i=0;i<t;++i)
                   b[i+1]=o(0,i),z[0].son[i]=i+1;
             }
             void _reassign(q&a,int s){
                q&t=z[a.tid];
                int id=a.son[s];
                if(s!=a.son.size()-1){
                   int idr=a.son[a.son.size()-1];
                   b[idr].second=s;
                   swap(a.son[s],a.son[a.son.size()-1]);
                }a.son.pop_back();
                b[id]=o(a.tid,t.son.size());
                t.son.push_back(id);
             }
             vector<o>split(vector<int>t){
                vector<o>q;
                for(int v:t){
                   if(z[b[v].first].tid==-1){
                      q.emplace_back(b[v].first,z.size());
                      z[b[v].first].tid=z.size(),z.emplace_back();
                   }_reassign(z[b[v].first],b[v].second);
                }for(o g:q)
                   z[g.first].tid=-1;
                return q;
             }
          };
       }
       typedef vector<int> inlist[alp];
       void DFA_Minimize(DFA&tt){
          DFA gg;
          int si=Cut_unreachable(gg,tt);
          PRS::p pr(si);
          vector<int>vi;
          inlist*inl=new inlist[si+1];
          for(int i=1;i<=si;++i){
             for(int j=0;j<alp;++j)
                inl[gg.nodes[i].t[j]][j].push_back(i);
             if(gg.nodes[i].a)
                vi.push_back(i);
          }auto gd=pr.split(vi)[0];
          stack<int>sets;
          sets.push(gd.second);
          pr.z[gd.second].in=1;
          while(!sets.empty()){
             int setNow=sets.top();sets.pop();
             pr.z[setNow].in=0;
             vector<int>qs;
             for(int i:pr.z[setNow].son)
                qs.push_back(i);
             for(int j=0;j<alp;++j){
                vi.clear();
                for(int i:qs)
                   for(int k:inl[i][j])
                      vi.push_back(k);
                auto qt=pr.split(vi);
                for(auto i:qt)
                   if(pr.z[i.first ].son.size()&&
                      pr.z[i.second].son.size())
                      if(pr.z[i.first ].in||
                         pr.z[i.first ].son.size()>
                         pr.z[i.second].son.size())
                         sets.push(i.second),pr.z[i.second].in=1;
                      else sets.push(i.first),pr.z[i.first].in=1;
             }
          }int id=1;
          for(auto i:pr.z)if(i.son.size())
             i.in=id++;
          tt.nodes.resize(id);
          for(auto i:pr.z)if(i.son.size()){
             Node&q=tt.nodes[i.in];
             Node&u=gg.nodes[i.son[0]];
             for(int j=0;j<alp;++j)
                q.t[j]=pr.z[pr.b[u.t[j]].first].in;
          }tt.starting=pr.z[pr.b[1].first].in;
          delete[]inl;
       }
    }
    int main(){
       return 0;
    }
    

    最后祝您身体健康,再见.

  • 相关阅读:
    Swift扩展(Extension)
    Swift构造器(Initializer)与析构器(Deinitializer)
    Swift下标
    Swift方法
    Swift属性
    Swift类与结构体
    Swift闭包(Closure)
    python调用c++/c 共享库,开发板上编译的一些坑!
    python调用c++类方法(2)
    ubuntu 18.04 gcc g++降级4.8版
  • 原文地址:https://www.cnblogs.com/tmzbot/p/6843662.html
Copyright © 2020-2023  润新知