#include<stdio.h>
#include<string.h>
#include<math.h>
int ninputs;
int dfa [100][2][100] = {0};
int state [10000] = {0};
char ch [10], str [1000];
int go [10000][2] = {0};
int arr [10000] = {0};
int main ()
{
int st, fin, in;
int f [10];
int i, j=3, s=0, final=0,flag=0,curr1,curr2,k,l;
int c;
printf ("\n follow the one based indexing\n");
printf ("\n enter the number of states::");
scanf ("%d", &st);
printf ("\n give state numbers from 0 to %d", st-1);
for (i=0; i<st; i++)
state[(int) (pow (2, i))] = 1;
printf ("\n enter number of final states\t");
scanf ("%d", &fin);
printf ("\n enter final states::");
for (i=0; i<fin; i++)
{
scanf ("%d", &f[i]);
}
int p, q, r, rel;
printf ("\n enter the number of rules according to nfa::");
scanf ("%d", &rel);
printf ("\n\n define transition rule as \n");
for (i=0; i<rel ; i++)
{
scanf ("%d%d%d", &p,&q,&r);
if (q==0)
dfa[p][0][r] = 1;
else
dfa[p][1][r] = 1;
}
printf ("\n enter initial state::");
scanf ("%d", &in);
in = pow (2, in);
i=0;
printf ("\n solving according to dfa");
int x=0;
for (i=0; i<st; i++)
{
for (j=0; j<2; j++)
{
int stf=0;
for (k=0; k<st; k++)
{
if (dfa [i][j][k] ==1)
stf = stf + pow (2, k);
}
go[(int) (pow (2, i))][j] = stf;
printf("%d-%d-->%d\n", (int) (pow (2, i)), j, stf);
if(state[stf]==0)
arr[x++] = stf;
state[stf] = 1;
}
}
//for new states
for (i=0; i<x; i++)
{
printf ("for %d ----- ", arr[x]);
for (j=0; j<2; j++)
{
int new=0;
for (k=0; k<st; k++)
{
if(arr[i] & (1<<k))
{
int h = pow (2, k);
if(new==0)
new = go[h][j];
new = new | (go[h][j]);
}
}
if(state[new]==0)
{
arr[x++] = new;
state[new] = 1;
}
}
}
printf ("\n the total number of distinct states are::\n");
printf ("state 0 1\n");
for (i=0; i<10000; i++)
{
if(state[i]==1)
{
//printf ("%d**", i);
int y=0;
if(i==0)
printf ("q0 ");
else
for (j=0; j<st; j++)
{
int x = 1<<j;
if (x& i)
{
printf ("q %d ", j);
y = y+ pow (2, j);
//printf ("y=%d ", y);
}
}
//printf ("%d", y);
printf (" %d %d", go[y][0], go[y][1]);
printf("\n");
}
}
j=3;
while(j--)
{
printf ("\n enter string");
scanf ("%s", str);
l = strlen(str);
curr1 = in;
flag = 0;
printf ("\n string takes the following path-->\n");
printf ("%d-",curr1);
for (i=0; i<l; i++)
{
curr1 = go[curr1] [str[i]-'0'];
printf ("%d-", curr1);
}
printf ("\n final state - %d\n", curr1);
for (i=0; i<fin; i++)
{
if (curr1 & (1<<f[i]))
{
flag = 1;
break;
}
}
if(flag)
printf ("\n string accepted");
else
printf ("\n string rejected");
}
return 0;
}