#include<iostream>
#include<string>
#define MAXS 100
using namespace std;
string NODE; //结点集合
string CHANGE; //终结符集合
int N; //NFA边数
struct edge
{ //状态图的边,包含一条边的起点,终点和终结符
string first;
string change;
string last;
};
struct chan
{ //状态转换矩阵集合
string ltab; //状态子集I
string jihe[MAXS]; //状态子集Ix
};
void range(string &a)
{//将a中的元素排序
int i,j;
char b;
for(j=0;j<a.length();j++)
for(i=0;i<a.length();i++)
if(NODE.find(a[i])>NODE.find(a[i+1]))
{
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
}
void eclosure(char c,string &he,edge b[])
{ //状态子集的e闭包,采用递归定义
int k;
for(k=0;k<N;k++)
{
if(c==b[k].first[0])
if(b[k].change=="*")
{ //如果c是一个边的起点,并且是经过e空字弧到达该边终点的,则该终点是e闭包的一个状态
if(he.find(b[k].last)>he.length())
he+=b[k].last;
eclosure(b[k].last[0],he,b);
}
}
}
void move(chan &he,int m,edge b[])
{ //状态转换函数Move(I,a)= e_Closure(J)其中,J={s’|s∈I且状态s经过a到达状态s’}
int i,j,k,l;
k=he.ltab.length();
l=he.jihe[m].length();
for(i=0;i<k;i++)
for(j=0;j<N;j++)
if((CHANGE[m]==b[j].change[0])&&(he.ltab[i]==b[j].first[0]))