1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| vector<int> z_function(string s) { int n=s.length(); vector<int> z(n); for(int i=1,l=0,r=0;i<n;i++){ if(i<=r&&z[i-l]<r-i+1){ z[i]=z[i-l]; }else{ z[i]=max(0,r-i+1); while(i+z[i]<n&&s[z[i]]==s[i+z[i]]){ ++z[i]; } } if(i+z[i]-1>r){ l=i,r=i+z[i]-1; } } return z; }
vector<int> Z_Funtion(string s,string p){ return z_function(p+"#"+s); }
|