Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Исходная строка – 10000 символов из романа «Война и мир», искомая строка: а) «князь» б) «императрица»
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Diagnostics;
- namespace ConsoleApplication2
- {
- class Program
- {
- static void Main(string[] args)
- {
- using (StreamReader input = new StreamReader("E:/practice/input.txt", Encoding.GetEncoding(1251)))
- {
- string text = input.ReadToEnd();
- Stopwatch timer = new Stopwatch();
- for (int q = 0; q < 2; q++)
- {
- timer.Start();
- Console.WriteLine("Введите искомое слово: ");
- string s = Console.ReadLine();
- const long P = 37;
- long[] array_P = new long[text.Length];
- array_P[0] = 1;
- for (int i = 1; i < text.Length; i++)
- array_P[i] = array_P[i - 1] * P;
- long[] array_hash = new long[text.Length];
- for (int i = 0; i < text.Length; i++)
- {
- array_hash[i] = (text[i] - 'a' + 1) * array_P[i]; //хэш текста
- if (i > 0)
- array_hash[i] += array_hash[i - 1];
- }
- long hash_s = 0;
- for (int i = 0; i < s.Length; i++)
- hash_s += (s[i] - 'a' + 1) * array_P[i]; //хэш подстроки
- //проводим поиск по хеш-значениям
- using (StreamWriter output = new StreamWriter("E:/practice/output.txt", true))
- {
- bool empty = true;
- for (int i = 0; i + s.Length - 1 < text.Length; i++)
- {
- // находим хэш-значение подстроки T начиная с позиции i длиною s.Length
- long cur_h = array_hash[i + s.Length - 1];
- if (i > 0)
- cur_h -= array_hash[i - 1];
- //приводим хэш-значения двух подстрок к одной степени
- if (cur_h == hash_s * array_P[i]) // если хеш-значения равны, то и подстроки равны
- {
- empty = false;
- output.WriteLine("Слово {0} найдено на {1}", s, i); // выводим позицию i, с которой начинается повторение
- }
- }
- if (empty)
- output.WriteLine("Слов не найдено");
- timer.Stop();
- output.WriteLine(timer.ElapsedMilliseconds);
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement