Pagini recente » Cod sursa (job #798711) | Cod sursa (job #2156392) | Cod sursa (job #798383) | Cod sursa (job #3202778) | Cod sursa (job #2794528)
#include <cstdio>
#include <cstring>
#define MAX 2000000
using namespace std;
char strA [MAX], strB[MAX];
int i, Hash, fHash, j, cntPoz, check;
int Poz [1000];
int addHash (char c, int var){
return var + (int) c;
}
int removeHash (char c, int var){
return var - (int) c;
}
int checkString (int a, int h){
int l;
l = 0;
while (l <= h){
if (strB[a + l - 1] != strA [l])
return 1;
l ++;
}
return 0;
}
int main() {
FILE *in, *out;
in = fopen("strmatch.in", "r");
out = fopen("strmatch.out", "w");
i --;
while (strA[i] != '\n'){
check = fgetc(in);
strA [++i] = check;
Hash = addHash (strA[i], Hash);
}
Hash -= 10;
i --;
for (j = 0; j <= i; j ++){
strB [j] = fgetc (in);
fHash = addHash (strB [j], fHash);
}
int LastPos = 0;
while ((strB[j - 1] >= 'A' && strB[j - 1] <= 'Z')||(strB[j - 1] >= 'a' && strB[j - 1] <= 'z')){
if (fHash == Hash ){
if (!checkString(j - i, i)) { Poz[cntPoz] = LastPos; cntPoz ++;}
}
fHash = removeHash (strB[j - i - 1], fHash);
strB [j] = fgetc (in);
j ++;
fHash = addHash (strB[j - 1], fHash);
LastPos ++;
}
fprintf (out, "%d\n", cntPoz);
for (int k = 0; k < cntPoz; k ++)
fprintf (out, "%d ", Poz[k]);
return 0;
}