Pagini recente » Cod sursa (job #2280159) | Cod sursa (job #3244627) | Cod sursa (job #3211971) | Cod sursa (job #2640153) | Cod sursa (job #2354334)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
char s1[2000005], s2[2000005];
int pref[200005], sz1, sz2, ans[200005], k;
void prefix()
{
int k = 0;
for(int i = 2; i <= sz1; i++) {
while(k && s1[k + 1] != s1[i]) k = pref[k];
if(s1[k + 1] == s1[i]) ++k;
pref[i] = k;
}
}
int main()
{
fin.getline(s1 + 1, 2000005);
fin.getline(s2 + 1, 2000005);
sz1 = strlen(s1 + 1);
sz2 = strlen(s2 + 1);
prefix();
int cnt = 0;
for(int i = 1; i <= sz2; i++) {
while(cnt && s2[i] != s1[cnt + 1]) cnt = pref[cnt];
if(s2[i] == s1[cnt + 1]) ++cnt;
if(cnt == sz1) {
cnt = pref[sz1];
ans[++k] = i - sz1;
}
}
for(int i = 1; i <= sz1; i++) fout << pref[i] << " ";
return 0;
}