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...