BZOJ4698 差分 二分 SA

2022-05-20 02:30:34 字數 2150 閱讀 3234

這題的難點在於相同的定義,在這樣的定義下一般的字串匹配演算法就不適用了。

但是可以通過乙個操作,將前後相鄰的字串差分形成乙個長度為len - 1的差分串,原來的相同下的定義就轉為了差分串的完全相同,證明顯然。

在這種情況下,再把字串全部拼接起來,用特殊字元隔開,然後二分他們的長度去做字尾陣列,看有沒有相鄰的乙個區間同時滿足長度最大並且包含所有k個字串。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define for(i, x, y) for(int i=x;i<=y;i++)

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

#define sca(x) scanf("%d", &x)

#define sca2(x,y) scanf("%d%d",&x,&y)

#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second typedef vector

vi;int read()

while (c >= '

0'&&c <= '

9')return x*f;}

const

double eps = 1e-9

;const

int maxn = 1e6 + 10

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,k;

intstr[maxn],id[maxn];

inta[maxn],height[maxn];

inttax[maxn],tp[maxn],sa[maxn],rak[maxn];

void

qsort()

void

sa()

}}void

get_height()

}int

stack[maxn];

bool

vis[maxn];

bool check(int

x)

if(!vis[id[sa[i - 1

]]])

if(!num) return

true

; }

else

}return

false;}

intsolve()

else

}return ans + 1;}

intmain()

str[++n] = ++m; id[n] =i;

}if(min <= 0

) sa(); get_height();

pri(solve());

return0;

}

二分 差分 思維

二分 差分 思維 當猜了乙個數 x 總共有三種情況 裁判說數大了,那麼裁判說對的取值範圍是 x 裁判說數小了,那麼裁判說對的取值範圍是 x,裁判說數一樣,那麼裁判說對的取值範圍是 x,x 那麼我們只需要求最大有多少個區間重疊了就行了,問題就轉化成了區間的修改,單點查詢,可以考慮差分了。注意題目資料 ...

金牌廚師(二分 差分)

乙個廚師可以做出辣度範圍是 1,n 的菜。現在有 m 個同學,每個同學可以接受的辣度範圍是 l i,r i 廚師每天會選擇一部分同學,做出讓他們都滿意的菜。滿意程度定義為選出的同學的人數 k 和能讓這部分同學都接受的菜的種類數 x 這裡理解為一種辣度對應一種菜 兩者中的最小值,即 min k,x 求...

2118 簽到題(二分 差分)

2118 簽到題 時間限制 1 sec 記憶體限制 128 mb 提交 54 解決 22 提交 狀態 討論版 命題人 admin 題目描述 作為acm集訓隊一員的你,有一天拿到了你的歷史訓練時長記錄表。你當然是想讓你的訓練時長看起來好看一些,所以你想調整這份記錄表,使得訓練時長最少的一天的時間在所有...