Pagini recente » Cod sursa (job #1541391) | Cod sursa (job #1444036) | Cod sursa (job #245790) | Cod sursa (job #402831) | Cod sursa (job #2388047)
#include <bits/stdc++.h>
#define Mod1 916027951
#define Mod2 144667717
#define NrC 26
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout("strmatch.out");
char s[2000005], c[2000005];
int val1, val2;
int verif1, verif2;
int k, n;
int raspuns[2000000], top = 0;
int p1, p2;
int main()
{
fin >> (c + 1);
k = strlen(c + 1);
fin >> (s + 1);
n = strlen(s + 1);
p1 = p2 = 1;
for(int i = 1; i <= k; i++)
{
val1 = (val1 * NrC + c[i]) % Mod1;
val2 = (val2 * NrC + c[i]) % Mod2;
verif1 = (verif1 * NrC + s[i]) % Mod1;
verif2 = (verif2 * NrC + s[i]) % Mod2;
if(i == 1) continue;
p1 = (p1 * NrC) % Mod1;
p2 = (p2 * NrC) % Mod2;
}
if(val1 == verif1 && val2 == verif2)
raspuns[++top] = 0;
for(int i = k + 1; i <= n; i++)
{
verif1 = (verif1 - (s[i - k] * p1 % Mod1) + Mod1) % Mod1;
verif1 = (verif1 * NrC + s[i]) % Mod1;
verif2 = (verif2 - (s[i - k] * p2 % Mod2) + Mod2) % Mod2;
verif2 = (verif2 * NrC + s[i]) % Mod2;
if(val1 == verif1 && val2 == verif2)
raspuns[++top] = i - k;
}
fout << top << "\n";
for(int i = 1; i <= top; i++)
fout << raspuns[i] << " ";
return 0;
}