Pagini recente » Cod sursa (job #1300818) | Cod sursa (job #1491024) | Cod sursa (job #1281169) | Cod sursa (job #2732837) | Cod sursa (job #1478733)
#include <fstream>
#include <string>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string a,b;
int n;
int zFunction[4000000];
int leftLimit, rightLimit;
int main(void){
in >> a;
in >> b;
a += "*"+b;
n =a.length();
leftLimit = 0;rightLimit = 0;
for (int i=1;i<n;i++){
if (i>rightLimit && a[i]==a[0]){
leftLimit = i;
for (rightLimit = leftLimit; rightLimit+1<n, a[rightLimit+1]==a[rightLimit-leftLimit+1];rightLimit++);
zFunction[i]=rightLimit-leftLimit+1;
}else if(i<=rightLimit){
zFunction[i] = zFunction[rightLimit-i];
if (rightLimit-i<a[i]){
leftLimit = i;
rightLimit = i+zFunction[i]-1;
for (;rightLimit+1<n, a[rightLimit+1]==a[rightLimit-leftLimit+1];rightLimit++);
zFunction[i]=rightLimit-leftLimit+1;
}
}
}
for (int i=0;i<n;i++) out << " " << zFunction[i];
return 0;
}