Pagini recente » Cod sursa (job #997678) | Cod sursa (job #371922) | Cod sursa (job #938116) | Cod sursa (job #579073) | Cod sursa (job #2692582)
#include <bits/stdc++.h>
#define MAX 2000005
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
char s1[MAX], s2[MAX];
int pi[MAX], d[MAX];
int i, k, n, m, cnt;
void build_pi(){
for(int i = 2; i <= n; i++){
while(k && s1[i] != s1[k + 1])
k = pi[k];
if(s1[i] == s1[k + 1])
k++;
pi[i] = k;
}
}
int main(){
in.getline(s1 + 1, MAX);
in.getline(s2 + 1, MAX);
s1[0] = s2[0] = ' ';
n = strlen(s1) - 1;
m = strlen(s2) - 1;
build_pi();
k = 0;
for(int i = 1; i <= m && cnt < 1000; i++){
while(k && s2[i] != s1[k + 1])
k = pi[k];
if(s2[i] == s1[k + 1])
k++;
d[i] = k;
}
for(int i = 1; i <= m; i++)
if(d[i] == n && cnt < 1000)
out<<i - n<<" ", cnt++;
}