Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int countHash(const unsigned char* str, int len, const int* power) {
- int hash = 0;
- for (int i = 0; i < len; i++) {
- hash = hash + (str[i] % 3) * power[i];
- }
- return hash;
- }
- int CountNewHash(int curHash, unsigned char prevSymbol, unsigned char nextSymbol, const int* power, int len) {
- return ((curHash - (prevSymbol % 3)) / 3) + (nextSymbol % 3) * power[len - 1];
- }
- void compareLines(const unsigned char* mask, const unsigned char* str, int curPos, int lenMask) {
- for (int i = 0; i < lenMask; i++) {
- printf("%d ", curPos + 1 + i);
- if (mask[i] != str[i]) return;
- }
- }
- int main() {
- unsigned char mask[17];
- int lenMask = 0;
- for (int i = 0; i < 17; i++) {
- if (scanf("%c", &mask[i])) {}
- if (mask[i] == '\n') {
- mask[i] = '\0';
- lenMask = i;
- break;
- }
- }
- int power[16];
- power[0] = 1;
- for (int j = 1; j < 16; ++j)
- power[j] = power[j-1] * 3;
- int hashOfMask = countHash(mask, lenMask, power);
- printf("%d ", hashOfMask);
- unsigned char str[17];
- for (int i = 0; i < lenMask; i++) {
- if (scanf("%c", &str[i]) != 1) return 0;
- }
- unsigned char buffer[1000];
- int bufferPos = 1000, curPos = 0, curHash = 0, inputResult = 0; //curPos - текущая позиция в тектсе;
- curHash = countHash(str, lenMask, power);
- if (curHash == hashOfMask) compareLines(mask, str, curPos, lenMask);
- while (1) {
- if (bufferPos == 1000) {
- inputResult = (int) fread(buffer, sizeof(unsigned char), 1000, stdin);
- bufferPos = 0;
- }
- if (inputResult == EOF || inputResult == bufferPos) {
- return 0;
- }
- curHash = CountNewHash(curHash, str[0], buffer[bufferPos], power, lenMask);
- for (int i = 0; i < lenMask - 1; i++) {
- str[i] = str[i+1];
- }
- str[lenMask - 1] = buffer[bufferPos];
- ++bufferPos;
- ++curPos;
- if (curHash == hashOfMask) compareLines(mask, str, curPos, lenMask);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement