Cod sursa(job #1700190)

Utilizator TincaMateiTinca Matei TincaMatei Data 9 mai 2016 19:36:58
Problema Potrivirea sirurilor Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#define MAX_HASH 32000000
#define MAX_SIZE 2000000
#define MAX_CHAR 62

char s1[MAX_SIZE];
char s2[MAX_SIZE];
int matches[MAX_SIZE];

int convChar(char ch) {
  if('a' <= ch && ch <= 'z')
    return ch - 'a';
  else if('A' <= ch && ch <= 'Z')
    return ch - 'A' + 26;
  else
    return ch - '0' + 52;
}

int check(int n1, int i) {
  int j;
  j = 0;
  while(j < n1 && s1[j] == s2[i + j])
    j++;
  return j == n1;
}

int main() {
  int n1, n2, hash1, hash2, p62, match, i;
  char ch;
  FILE *fin = fopen("strmatch.in", "r" );
  ch = fgetc(fin);
  n1 = 0;
  hash1 = 0;
  p62 = 1;
  while(ch != '\n') {
    s1[n1] = ch;
    hash1 = hash1 * MAX_CHAR + convChar(ch);
    hash1 = hash1 % MAX_HASH;
    if(n1 >= 1)
      p62 = p62 * MAX_CHAR % MAX_HASH;
    n1++;
    ch = fgetc(fin);
  }
  ch = fgetc(fin);
  n2 = 0;
  hash2 = 0;
  match = 0;
  while(ch != '\n') {
    s2[n2] = ch;
    hash2 = hash2 * MAX_CHAR + convChar(ch);
    hash2 = hash2 % MAX_HASH;
    n2++;
    if(n2 >= n1) {
      if(hash1 == hash2 && check(n1, n2 - n1)) {
        matches[match] = n2 - n1;
        match++;
      }
      hash2 = (hash2 - p62 * convChar(s2[n2 - n1]) % MAX_HASH + MAX_HASH)%MAX_HASH;
    }
    ch = fgetc(fin);
  }
  fclose(fin);

  FILE *fout = fopen("strmatch.out" ,"w");
  fprintf(fout, "%d\n", match);
  if(match > 1000)
    match = 1000;
  for(i = 0; i < match; i++)
    fprintf(fout, "%d ", matches[i]);
  fclose(fout);
  return 0;
}