牛客周赛 Round 38 F(子序列自动机 )

题目链接

注释写的很详细了。

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int a[100100],la[100100];
int L[100100];
//观察只要有y x y 就行,因为其他>2的回文串一定属于这个例如:1 1 2 1 1
int main()
{
    int n,q; cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(mp.count(a[i])) la[i]=mp[a[i]];
        mp[a[i]]=i;//mp统计上一个a[i]出现的位置,0表示没有
    }
    for(int i=n;i;i--)
    {
        //若该数字在上一个位置,则取再前一位
        if(la[i]==i-1) la[i]=la[la[i]];//la表示a[i]这个数字上一次出现的下标,并且还不是i-1
    }
    //la[i]表示第i个位置能构成回文值串的下标最大位置
    for(int i=1;i<=n;i++) la[i]=max(la[i],la[i-1]);
    while(q--)
    {
        int l,r; cin>>l>>r;
        if(la[r]>=l) cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }
    return 0;
}

   

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值