BZOJ4453 cys就是要拿英魂!

2021-07-10 22:01:16 字數 1919 閱讀 3764

description

第一行是乙個字串s,表示pps放的技能

第二行乙個正整數q,表示詢問個數

接下來q行,每行兩個正整數[l,r],表示詢問區間[l,r]中的字典序最大的子串。

output

q行,每行乙個正整數,表示該區間內字典序最大的子串的起始位置。

sample input

lets_go_mod_p!

2 23 3

2 51 10

2 9

sample output

資料範圍:

1<=|s|<=100000

1<=q<=100000

1<=l<=r<=|s|

hint

source

原題是neerc2012.

一開始一看..這個東西是不是叫區間border來著?border_tree?不會..pass掉..

後來一想..線段樹套字尾平衡樹?那是啥..問claris..不可做..

最後發現..其實什麼高階的科技都不需要..

zimpha在icpccamp的官方論壇裡給出了乙個題解.

題目討論

如果你打不開這個題解,我還有截圖:

因為他寫的非常詳細,所以我也不細寫了..

真的是非常好的思想和姿勢,沒有使用高階字串資料結構就解決了這個題.

為什麼qiancl大爺寫什麼題都跑的那麼快…

他做過的題我從沒有乙個rank比他高..(砸

#include

#include

#include

#include

#include

#include

#define maxn 100010

#define base 55001

#define ll unsigned long long

#define get (ch>='0'&&ch<='9')

using

namespace

std;

int n,q,top1,top2,tp;

int ans[maxn];

char ch[maxn];

bool vis[maxn];

ll hash[maxn],pow[maxn];

int sta[maxn];

struct query

e1[maxn<<1],*prev1[maxn],e2[maxn<<1],*prev2[maxn];

struct edge e[maxn],*prev[maxn];

inline

void insert1(int u,int v)

inline

void insert2(int u,int v)

inline

void add(int x,int l,int id)

set s;

inline

void in(int &x)

inline

int lcp(int a,int b)

return ret;

}void dfs(int x)

int main()

sta[++sta[0]]=i;

for (edge *j=prev1[i];j;j=j->next) if (!vis[j->to]) dfs(j->to);

for (edge *j=prev[i];j;j=j->next) ans[j->id]=*s.lower_bound(j->l);

}for (int i=1;i<=q;i++) printf("%d\n",ans[i]);

}

BZOJ 4453 cys就是要拿英魂!

題鏈 題解 字尾陣列,離線詢問,棧 看了一堆題解才看懂,太弱啦 如果對於乙個區間 l,r 有兩個字尾i,j,令 irank j 那麼i肯定比j優。2 如果rank i r?j 1,那麼i比j更優。所以,從後向前遍歷一遍字串,每次把遍歷到的當前位置固定為上述區間的左端點l,那麼後面的區間就會被分為若干...

BZOJ2844 albus就是要第乙個出場

傳送門 給定乙個含 n 個自然數的集合s,將 2s中所有集合的所有元素的異或和從小到大排列 下標從 1 開始 求ta r在其中第一次出現的下標 保證給出的數出現過 對 10086 取模.1 n 105 ai 109.首先tar 0的情況最好先特判掉.然後我們要求的是從 s 中取若干元素 可以不取 異...

bzoj 2844 albus就是要第乙個出場

首先就是乙個線性基。然後不能放進去的相當於0,然後列舉前多少位和m相同,那麼後一位比m小的方案累加入答案即可。ac 如下 include define mod 10086 using namespace std int n,m,cnt,bin 35 bs 35 s 35 bool ins int x...