Advertisement
Sephinroth

prac 12

Dec 1st, 2019
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.13 KB | None | 0 0
  1. // Исходная строка – 10000 символов из романа «Война и мир», искомая строка: а) «князь» б) «императрица»
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.IO;
  8.  
  9. namespace ConsoleApplication2
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             StreamReader input = new StreamReader("e:/practice/input.txt", Encoding.GetEncoding(1251));
  16.             string text = input.ReadToEnd();
  17.             Console.WriteLine("Введите искомое слово: ");
  18.             string s = Console.ReadLine();
  19.             const long P = 37;
  20.             long[] arr = new long[text.Length];
  21.             arr[0] = 1;
  22.             for (int i = 1; i < text.Length; i++)
  23.             {
  24.                 arr[i] = arr[i-1] * P;
  25.             }
  26.             long[] h_arr = new long[text.Length];
  27.             for (int i = 0; i < text.Length; i++)
  28.             {
  29.                 h_arr[i] = (text[i] -'a' + 1) * arr[i]; //1
  30.                 if(i > 0)
  31.                     h_arr[i] += h_arr[i-1];
  32.             }
  33.             long h_s = 0;
  34.             for (int i = 0; i < s.Length; i++)
  35.             {
  36.                 h_s += (s[i] -'a' + 1) * arr[i];
  37.             }//проводим поиск по хеш-значениям
  38.             StreamWriter output = new StreamWriter("e:/practice/output.txt", true);
  39.             for (int i = 0; i + s.Length - 1 < text.Length; i++)
  40.             {
  41.                 // находим хэш-значение подстроки T начиная с позиции i длиною s.Length
  42.                 long cur_h = h_arr[i + s.Length - 1];
  43.                 if (i > 0)
  44.                 {
  45.                     cur_h -= h_arr[i -1];
  46.                 }//приводим хэш-значения двух подстрок к одной степени
  47.                 if (cur_h == h_s * arr[i]) // если хеш-значения равны, то и подстроки равны
  48.                 {
  49.                     output.WriteLine("Слово {0} найдено на {1}", s, i); // выводим позицию i, с которой начинается повторение
  50.                 }
  51.             }
  52.            
  53.     }
  54. }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement