Pagini recente » Cod sursa (job #1081839) | Cod sursa (job #1032566) | Cod sursa (job #52413) | Cod sursa (job #3253576) | Cod sursa (job #2714030)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
const int nmx = 2e6 + 5;
int n, m, pi[nmx];
char a[nmx], b[nmx];
void read(){
cin >> (a + 1);
cin >> (b + 1);
//cout << (a + 1) << " " << (b + 1) << "\n";
n = strlen(a + 1);
m = strlen(b + 1);
}
void prefix(){
int k = 0;
pi[1] = 0;
for(int i = 2; i <= n; i++){
while(k > 0 && a[k + 1] != a[i])
k = pi[k];
if(a[k + 1] == a[i])
k++;
pi[i] = k;
}
}
void kmp(){
int q = 0;
int ap = 0;
for(int i = 1; i <= m; i++){
while(q > 0 && a[q + 1] != b[i])
q = pi[q];
if(a[q + 1] == b[i])
q++;
if(q == n){
ap++;
cout << i - n << " ";
if(ap == 1000)
break;
}
}
}
int main()
{
read();
prefix();
kmp();
return 0;
}