题目
题解
大水题,对于每个位置标记前一个相同串位置在哪,询问区间的时候给标记取个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;
}