題目連線:
題解:
列舉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 就是最長子字串。解題過程 這個問題最直接的解...