Pagini recente » Cod sursa (job #2277892) | Istoria paginii utilizator/izabelaiancu | Cod sursa (job #864453) | Cod sursa (job #1100518) | Cod sursa (job #2015447)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <deque>
#include <cstring>
#define ll long long
using namespace std;
const int inf = 3e4 + 5;
const int NMax = 2e6 + 5;
const int mod1 = 100003;
const int mod2 = 100007;
const int base = 73;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
int N,M,nrSol;
int sol[NMax];
char patt[NMax],str[NMax];
int main() {
in>>patt>>str;
N = strlen(patt);
M = strlen(str);
ll pattHash1 = 0,strHash1 = 0;
ll pattHash2 = 0,strHash2 = 0;
ll pw1 = 1,pw2 = 1;
for (int i=0;i < N;++i) {
pattHash1 = (pattHash1 * base + patt[i]*base) % mod1;
pattHash2 = (pattHash2 * base + patt[i]*base) % mod2;
strHash1 = (strHash1 * base + str[i]*base) % mod1;
strHash2 = (strHash2 * base + str[i]*base) % mod2;
pw1 = (pw1 * base) % mod1;
pw2 = (pw2 * base) % mod2;
}
if (pattHash1 == strHash1 && pattHash2 == strHash2) {
sol[++nrSol] = 0;
}
for (int i=N;i < M;++i) {
strHash1 = (( strHash1 - ((str[i-N]*pw1)%mod1) + mod1 ) * base + str[i]*base) % mod1;
strHash2 = (( strHash2 - ((str[i-N]*pw2)%mod2) + mod2 ) * base + str[i]*base) % mod2;
if (pattHash1 == strHash1 && pattHash2 == strHash2) {
sol[++nrSol] = i-N+1;
}
}
out<<nrSol<<'\n';
nrSol = min(1000,nrSol);
for (int i=1;i <= nrSol;++i) {
out<<sol[i]<<' ';
}
in.close();out.close();
return 0;
}