Pagini recente » Diferente pentru admin/task-ratings-guidelines intre reviziile 7 si 6 | Diferente pentru utilizator/johnnycode intre reviziile 1 si 36 | Diferente pentru utilizator/johnnycode intre reviziile 15 si 36 | Diferente pentru utilizator/johnnycode intre reviziile 10 si 36 | Cod sursa (job #3333271)
#include <iostream>
#include <cstring>
#include <vector>
#include <climits>
#include <fstream>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
vector <int> h;
const int MOD = INT_MAX;
char A[2000001],B[2000001];
int N;
int LenA,LenB;
vector <int> res;
void Citire(){
fin>>A>>B;
}
bool Verifica(int poz){
char aux[2000001];
int ind=0;
return true;
for (int i=poz;i<=poz+LenA-1;++i)
aux[ind++]=B[i];
aux[ind]='\0';
if (strcmp(aux,A)==0)
return true;
return false;
}
void Rezolvare(){
LenA=strlen(A);
LenB=strlen(B);
if (LenA>LenB){
cout<<0;
return;
}
long long NrA=0;
for (int i=0;A[i];++i){
char ch=A[i];
NrA=(NrA*10+ch)%MOD;
}
long long Nr1=0;
long long Put=1;
for (int i=0;A[i];++i){
char ch=B[i];
Nr1=(Nr1*10+ch)%MOD;
if (A[i+1])
Put=Put*10%MOD;
}
h.push_back(Nr1);
for (int i=1;i<=LenB-LenA;++i){
char ch=B[i];
long long Nr2=((Nr1-B[i-1]*Put)*10%MOD+B[i+LenA-1])%MOD;
Nr1=Nr2;
h.push_back(Nr2);
}
for (int i=0;i<h.size();++i){
long long Numar=h[i];
if (Numar!=NrA)
continue;
bool p=Verifica(i);
if (N==1000)
break;
if (p){
N++;
res.push_back(i);
}
}
}
void Afisare(){
fout<<N<<"\n";
for (auto i:res)
fout<<i<<' ';
}
int main()
{
Citire();
Rezolvare();
Afisare();
return 0;
}