Pagini recente » Cod sursa (job #1640732) | Cod sursa (job #1701475) | Cod sursa (job #1691179) | Cod sursa (job #3265936) | Cod sursa (job #2456773)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define lMax 1000000
int N, M;
int pos[1001], prefix[lMax];
void read_data(char** string, char** text, const char* filename)
{
FILE* fp = fopen(filename, "r");
char buffer[lMax];
fgets(buffer, lMax, fp);
N = strlen(buffer)-1;
(*string) = new char[N];
strcpy((*string)+1, buffer);
fgets(buffer, lMax, fp);
M = strlen(buffer);
(*text) = new char[M];
strcpy((*text)+1, buffer);
fclose(fp);
}
void prefix_table(char* string)
{
prefix[1] = 0;
int i = 0;
for (int j = 2; j <= N; j++)
{
while (i > 0 && string[i+1] != string[j])
i = prefix[i];
if (string[i+1] == string[j])
i++;
prefix[j] = i;
}
}
void KMP(int *poz,char* string, char* text)
{
int i = 0;
for (int j = 1; j <= M; j++)
{
while (i > 0 && string[i + 1] != text[j])
{
i = prefix[i];
}
if (string[i + 1] == text[j])
i = i + 1;
if (i == N)
{
pos[(*poz)++] = j - N;
i = prefix[i];
}
}
}
int main()
{
FILE* fout = fopen("strmatch.out", "w");
char* A, * B;
read_data(&A, &B, "strmatch.in");
prefix_table(A);
int poz = 0;
KMP(&poz, A, B);
fprintf(fout,"%d\n", poz);
for (int i = 0; i < poz; i++)
{
fprintf(fout,"%d ", pos[i]);
}
return 0;
}