FZU 2137 奇異字串 字尾樹組 RMQ

2022-04-17 01:41:07 字數 1255 閱讀 5636

題目連線:

題解:

列舉x位置,向左右延伸計算答案

如何計算答案:對字串建立sa,那麼對於想雙延伸的長度l,假如有lcp(i-l,i+1)>=l那麼就可以更新答案

複雜度  建立sa,lcp等nlogn,列舉x及向兩邊延伸26*n

#include#include

#include

#include

#include

using

namespace

std;

#pragma comment(linker, "/stack:102400000,102400000")

#define ls i<<1

#define rs ls | 1

#define mid ((ll+rr)>>1)

#define pii pair#define mp make_pairtypedef

long

long

ll;const

long

long inf = 1e18+1ll;

const

double pi = acos(-1.0

);const

int n = 1e5+10, m = 2e5+20, mod = 1e9+7, inf =2e9;

///heght[i] 表示 suffix(sa[i-1])和suffix(sa[i]) 的最長公共字首:

///rank[i] 表示 開頭為i的字尾的等級:

///sa[i] 表示 排名為i的字尾 的開頭位置:

int *rank,r[n],sa[n],height[n],wa[n],wb[n],wm[n];

bool cmp(int *r,int a,int b,int

l) void sa(int *r,int *sa,int n,int

m) }

rank=x;

}void height(int *r,int *sa,int

n) int dp[n][30

],n;

char

a[n];

void

lcp_init()

}}int lcp(int l,int

r) int

main()

}printf(

"%i64d\n

",ans);

}return0;

}

字串hash fzu 2137 奇異字串

1.利用unsigned long long 越界取模 2.題意的奇異串是axa,就是x旁邊兩個串是要一樣的,不是相反的。注意x不能在a中出現,根據這個,a的範圍只可能在x與上乙個字母x之間,可以直接列舉。這樣對於乙個字母x,總的列舉複雜度是o n 的,最多26種字母,總複雜度o 26 n 列舉後判...

字串匹配之後綴樹

試想有這樣乙個問題,有乙個長度為n的字串a n值很大 還有乙個模式串b,b的長度為m n m很大,說明b只是乙個小片段 此時需要判斷b是否是a的字串。如果我們使用kmp演算法的話,那麼複雜度為o n 對a串進行k次模式匹配的話就是ko n 此時為了降低複雜度,我們可以考慮預處理長字串a,是的,如果我...

字尾樹求最長子字串

問題描述 給定乙個文字檔案作為輸入,查詢其中的最長子字串。例如,ask not what your country can do for you,but what you can do for your country 中的 can do for you 就是最長子字串。解題過程 這個問題最直接的解...