题意:给出一个函数f[i]: 以i开头找到最长前缀f[i]使得,[1,f[i]] = [i,i+f[i]-1].
函数g[i]定义为:以i结尾能找到和它匹配的最长前缀(g[i]<i) 即[1..g[i]]=[i-g[i]+1,i].
n<=1e5.给出f[i] 求出函数g[i].
已知[1,f[i]] = [i,i+f[i]-1].
函数g[i]定义为:以i结尾能找到和它匹配的最长前缀(g[i]<i) 即[1..g[i]]=[i-g[i]+1,i].
n<=1e5.给出f[i] 求出函数g[i].
已知[1,f[i]] = [i,i+f[i]-1].
计算g[i]时 记录当前最左边的左端点le.如果le+f[le]-1>=i 则找到[le,i].令g[i]=i-le+1. 否则只能le向后移动.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,a[N],b[N];
int main()
{
cin>>n;
for(int i=2;i<=n;i++)
scanf("%d",&a[i]);
int le=1;
for(int i=2;i<=n;i++)
{
while(le<=i)
{
if(le+a[le]-1>=i)
break;
le++;
}
if(le<=i)
b[i]=i-le+1;
}
for(int i=2;i<=n;i++)
printf("%d%c",b[i],i==n?'\n':' ');
return 0;
}