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;
}

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

posted @ 2017-05-12 02:09  zball  阅读(347)  评论(0编辑  收藏  举报