codevs3184 SYY奇遇记·····3

题目

codevs3184 SYY奇遇记·····3

题解

大水题,对于每个位置标记前一个相同串位置在哪,询问区间的时候给标记取个max,如果取出来>=ql(询问左边界),就存在相同的。

骗分乱搞方法好像是对于长区间默认存在,短区间暴力匹配。

反正也很水别管什么骗分了直接写正解也快得很啊qwq,什么map,string一起上也没事,不用hash很简洁,可能有点慢,能过就行。

区间最大值别去写线段树了,又长常数又大,st表是个好东西。

代码

//QWsin
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int logn=17;
const int maxn=100000+10;

map<string,int>pre;

string s;

int n,st[maxn][logn+2];
//st存最大值 
inline void init_st()
{
    for(int i=1;i<=logn;++i)
        for(int j=1;j+(1<<i)-1<=n;++j)
            st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}

inline int max(int l,int r)
{
    int ret=0;
    for(int i=logn;i>=0;--i)
        if(l+(1<<i)-1 <= r)
        {
            ret=std::max(ret,st[l][i]);
            l+=1<<i;
        }
    return ret;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>s;
        if(pre.count(s)) st[i][0]=pre[s],pre[s]=i;
        else pre[s]=i,st[i][0]=0;
    }

    init_st();

    int Q,ql,qr;cin>>Q;
    while(Q--)
    {
        scanf("%d%d",&ql,&qr);
        int t=max(ql,qr);
        puts(t >= ql?"NO":"YES");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值