CS 300 Prefix Matches 双指针

来源:互联网 发布:java中注解 编辑:程序博客网 时间:2024/06/01 16:13
题意:给出一个函数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]时 记录当前最左边的左端点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;}


原创粉丝点击