Advertisement
Infiniti_Inter

12 (S)

Dec 9th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.94 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Text.RegularExpressions;
  7. using System.IO;
  8.  
  9.  
  10. namespace ConsoleApp1
  11. {
  12.     class Program
  13.     {
  14.  
  15.         static string generator(int n)
  16.         {
  17.             Random rand = new Random();
  18.             char cur;
  19.             StringBuilder result = new StringBuilder();
  20.             for (int i = 0; i < n; i++)
  21.             {
  22.                 cur = (char)('a' + rand.Next(0, 9));
  23.                 result.Append(cur);
  24.             }
  25.             return result.ToString();
  26.         }
  27.         static void Main(string[] args)
  28.         {
  29.             string t = generator(10000);
  30.             string s = generator(3);
  31.             using (StreamWriter output = new StreamWriter("C:/Users/karpenkoos/desktop/output.txt"))
  32.             {
  33.                 output.WriteLine($"T = {t}");
  34.                 output.WriteLine($"S = {s}");
  35.  
  36.                 const long P = 37;
  37.                 //вычисляем массив степеней P
  38.                 long[] pwp = new long[t.Length];
  39.                 pwp[0] = 1;
  40.                 for (int i = 1; i < t.Length; i++)
  41.                 {
  42.                     pwp[i] = pwp[i - 1] * P;
  43.                 }
  44.                 //вычисляем массив хэш-значение для всех префиксов строки T
  45.                 long[] h = new long[t.Length];
  46.                 for (int i = 0; i < t.Length; i++)
  47.                 {
  48.                     h[i] = (t[i] - 'a' + 1) * pwp[i]; //1
  49.                     if (i > 0)
  50.                         h[i] += h[i - 1];
  51.                 }
  52.                 // вычисляем хэш-значение для подстроки S
  53.                 long h_s = 0;
  54.                 for (int i = 0; i < s.Length; i++)
  55.                 {
  56.                     h_s += (s[i] - 'a' + 1) * pwp[i];
  57.                 }
  58.                 //проводим поиск по хеш-значениям
  59.                 output.WriteLine("индексы вхождений:");
  60.                 for (int i = 0; i + s.Length - 1 < t.Length; i++)
  61.                 {
  62.                     // находим хэш-значение подстроки T начиная с позиции i длиною s.Length
  63.                     long cur_h = h[i + s.Length - 1];
  64.                     if (i > 0)
  65.                     {
  66.                         cur_h -= h[i - 1];
  67.                     }
  68.                     //приводим хэш-значения двух подстрок к одной степени
  69.  
  70.                     if (cur_h == h_s * pwp[i]) // если хеш-значения равны, то и подстроки равны
  71.                     {
  72.                         output.WriteLine("{0} ", i); // выводим позицию i, с которой начинается повторение
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement