Pagini recente » Cod sursa (job #2962754) | Cod sursa (job #930467) | Cod sursa (job #2681429) | Cod sursa (job #1575356) | Cod sursa (job #1700190)
#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;
}