Все знают, что это ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int LITERA = 256, N = 40;
int main()
{
ifstream in_t ("tokens.txt"); // Каждое ключевое слово в файле написано на отдельной строчке
int automat [N][LITERA] = {0}; // матрица, задающая автомат. Хранит номера состояний для перехода по ним
int b[N] = {-1}; // массив, показывающий является ли данное состояние конечным. Если да, то для какой строки
int n_status = 1; // счетчик, меняющий свое значения, для уазания следующего по порядку сосотояния
int n_string = 0; // номер строки. Нужен для массива b[i]
while (in_t.peek() != EOF)
{
string temp;
getline(in_t, temp);
int status = 0; // текущее состояние автомата
for (int i = 0; i < temp.size(); i++) // разбираем слово
{
if (!automat[status][temp[i]]) //если текущее состояние начальное
{
automat[status][temp[i]] = n_status; // присваиваем ячейке от текущего состояния и текущей
// буквы следующий номер состояния
status = n_status++; // изменяем текущее состояние и счетчик
}
else status = automat[status][temp[i]]; //иначе просто присваиваем
}
b[status] = n_string++; // после конца слова записываем в массив от текущего состояния номер строчки
// с текущим ключевым словом
}
for (char c = '0'; c <= '9'; c++)
automat[0][c] = automat[n_status][c] = n_status; // строчка от Артема Рахова для работы с константами
return 0;
}