Description
对于给出的NFA和输入的字符串,判断字符串是否是NFA识别的语言。
Input
输入有多组数据。每组数据的第一行是两个整数N(N<=50)和M(M<=27),表示NFA有N个状态,以及字母表有M-1个字符。NFA的N个状态用整数0~N-1表示,状态0为起始状态。字母表包含小写英文字母的前M-1个字符。接下来的N行,每行有M个整数集(用’{‘和’}'括起)。其中,第i行第1列的整数集表示在状态i-1时,对应于є(空串)的状态迁移;第i行第j(j>1)列的整数集,表示NFA在状态i-1,当输入符号为第j-1个小写字母时,迁移到的状态集。接下来的一行包含若干个整数,代表NFA的接受状态,这一行以-1结尾。接下来的每一行是一个待识别的字符串,字符串的长度在1到50之间且只含有小写字母。字符串"#"代表本组数据结束。N=M=0表示输入结束。
Output
对于每个待识别的字符串,如果能被给出的NFA识别,输出YES;否则输出NO。
Sample Input
4 3
{
} {
0,1} {
0}
{
} {
} {
2}
{
} {
} {
3}
{
} {
} {
}
3 -1
aaabb
abbab
abbaaabb
abbb
#
0 0
Sample Output
YES
NO
YES
NO
Hint
输入样例是课本Figure 3.24的NFA。你需要实现的是课本Figure 3.33和3.37的算法。
思路
模拟。
基本思路和DFA一样,不过我们要考虑空状态的转移,以及我们需要存一个状态集而不是一个状态。
代码
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int n, m, accept_num;
char alphabet[27];
int accept[51];
int map[50][27][51];
int state[50];
int state1[50];
int statenum, state1num;
string s;
bool check;
void init(int n, int m){
string s;
int num, temp;
for(int i = 0; i < n; ++i){
for(int j