В институте я много слышал про конечные автоматы (КА), но это всё было теорией - как облака в небе: воды в них много, а напиться нельзя. Корпел три месяца после института, пока не реализовал свой КА в коде в 1981 году. Сейчас существует методология программирования на этой основе - v-agent oriented programming (VAOP) - и множество примеров её реализации. Лучше начать знакомство с VAOP с этой статьи на Medium: "Bagels and Muffins of Programming or How Easy It Is to Convert a Bagel into a Black Hole" или на Хабре: "Бублики и Коржики Программирования".
Оно конечно спасибо. Это вот за такие наскальные надписи Вам вручили: "лауреат специальной премии корпорации IBM, присуждаемой за успехи в тренерской работе, лауреат премии 2016 ACM ICPC Senior Coach Award" ? Верю, что когда Вы перейдёте на современные способы обучения, Вам ещё дадут кучу премий.
автомат ищущий подстроку в строке на c# сначала ввод строки, потом подстроки ест любые буквы алфавита int[] suf; Dictionary go; string p; int n , j = 0; int get_go(int j , char c) { if (go.ContainsKey((j, c))) return go[(j, c)]; int temp = get_suf(j , c); if (j < n && c == p[j]) go[(j, c)] = j + 1; else if (j > 0) go[(j, c)] = go[(temp, c)]; else go[(j, c)] = 0; return go[(j, c)]; } int get_suf(int i , char c) { if (i == 0 || i == 1) suf[i] = 0; else suf[i] = get_go(suf[i - 1], c); return suf[i]; } string s = Console.ReadLine(); p = Console.ReadLine(); n = p.Length; go = new Dictionary(); suf = new int[n + 1]; for (int i = 0; i < n; i++) suf[i] = -1; int answer = 0; for (int i = 0; i < s.Length; i++) { j = get_go(j, s[i]); if (j == p.Length) answer++; } Console.WriteLine(answer);