Pagini recente » Cod sursa (job #2924635) | Cod sursa (job #899073) | Cod sursa (job #3191249) | Cod sursa (job #2414907) | Cod sursa (job #2677565)
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
#define min(a, b) ((a)<(b)?(a):(b))
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char string_array[2000005], pattern[2000005];
//void prefix_suffix(char pattern[]) {
// int n = strlen(pattern);
// int i = 0;
// while (i < n) {
// char prefix[i + 1];
// char suffix[i + 1];
// for (int j = 0; j <= i; ++j) {
// prefix[j] = pattern[j];
// suffix[i - j] = pattern[n - j - 1];
// }
// prefix[i + 1] = '\0';
// suffix[i + 1] = '\0';
// cout << prefix << "\n";
// cout << suffix << "\n";
// i++;
// }
//}
void lps(int lps_array[], char pattern[]){
lps_array[0] = 0;
int i = 1, n = strlen(pattern), len = 0;
while(i < n){
if(pattern[i] == pattern[len]){
len++;
lps_array[i] = len;
i++;
}
else{
if(len != 0){
len = lps_array[len - 1];
}
else{
lps_array[i] = 0;
i++;
}
}
}
}
void kmp(char sequence[], char pattern[]){
int i = 0, j = 0, n = strlen(sequence), m = strlen(pattern);
int lps_array[m], cnt = 0, matches[1000];
lps(lps_array, pattern);
while(i < n){
if(sequence[i] == pattern[j]){
i++;
j++;
if(j == m){
cnt++;
if(cnt < 1000){
matches[cnt] = i - j;
}
j = lps_array[j - 1];
}
}
else if((i < n) && (pattern[j] != sequence[i])){
if(j > 0){
j = lps_array[j - 1];
}
else{
i++;
}
}
}
fout << cnt << "\n";
for(int i = 0; i < min(cnt, 1000); ++i){
fout << matches[i] << " ";
}
}
int main(){
fin >> pattern;
fin >> string_array;
kmp(string_array, pattern);
return 0;
}