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]定义为:以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;}
阅读全文
0 0
- CS 300 Prefix Matches 双指针
- matches()
- CS R26 C(双指针),D(观察,模拟),E(LIS经典 好题)
- prefix
- CS..........................
- cs
- cs
- cs
- Cs
- cs
- cs
- cs
- CS
- cs
- cs,
- cs
- cs
- cs
- 《c语言程序设计》例题 4-3 4-4
- Protobuf与JAVA
- typedef和#define的用法与区别
- NodeJs入门------第一个demo
- POJ1006
- CS 300 Prefix Matches 双指针
- mysql基础知识
- Longest Palindromic Substring
- html浮动与定位
- 1、操作系统的概念、特征、功能和提供的服务
- C语言作业
- 程序实现高次幂一元多项式乘法
- printf()经常有重入和性能上,不可重入意思?
- 树状数组的区间修改求和