Pagini recente » Cod sursa (job #772151) | Cod sursa (job #917833) | Cod sursa (job #1638702) | Cod sursa (job #2365642) | Cod sursa (job #1182959)
#include <fstream>
#include <string>
#include <vector>
#include <list>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#define PRIME 100007
string P, T;
int rP, rT, h = 1;
vector<int> noP; list<int> noT;
vector<int> s; int nos;
int main(){
int i, lgP, k; char x;
fin >> P; lgP = P.size();
for (i = 0; i < lgP; i++) {
noP.push_back(P[i] - 38);
rP = (100 * rP + (P[i] - 38)) % PRIME;
}
fin.get(x);
for (i = 0; i < lgP; i++){
fin.get(x); T += x;
noT.push_back(T[i] - 38);
rT = (100 * rT + (T[i] - 38)) % PRIME;
}
for (i = 1; i < lgP; i++) h = (h * 100) % PRIME;
k = 0;
while (!fin.eof() && nos < 1000){
if (rP == rT){
for (i = 0; i < lgP; i++) if (P[i] != T[i]) break;
if (i == lgP) nos++, s.push_back(k);
}
fin.get(x); T += x; noT.push_back(x - 38);
rT = (100 * ((rT - (noT.front()*h) % PRIME) % PRIME) + (x - 38)) % PRIME;
rT = (rT + PRIME) % PRIME;
T.erase(0, 1); noT.pop_front();
k++;
}
fout << nos << '\n';
for (i = 0; i < s.size(); i++) fout << s[i] << ' ';
return 0;
}