十二省聯考2019 字串問題

2022-07-25 20:03:13 字數 2125 閱讀 9532

現有乙個字串 \(s\)。

tiffany 將從中劃出 \(n_a\) 個子串作為 \(a\) 類串,第 \(i\) 個(\(1 \leqslant i \leqslant n_a\))為 \(a_i = s(la_i, ra_i)\)。

類似地,yazid 將劃出 \(n_b\) 個子串作為 \(b\) 類串,第 \(i\) 個(\(1 \leqslant i \leqslant n_b\))為 \(b_i = s(lb_i, rb_i)\)。

現額外給定 \(m\) 組支配關係,每組支配關係 \((x, y)\) 描述了第 \(x\) 個 \(a\) 類串支配第 \(y\) 個 \(b\) 類串。

求乙個長度最大的目標串 \(t\),使得存在乙個串 \(t\) 的分割 \(t = t_1+t_2+· · ·+t_k\)(\(k \geqslant 0\))滿足:

方便起見,你只需要輸出這個最大的長度即可。

特別地,如果存在無限長的目標串(即對於任意乙個正整數 \(n\),都存在乙個滿足限制的長度超過 \(n\) 的串),請輸出 \(-1\)。

首先這個問題可以轉化,每個a向可支配的b連邊,b向符合條件的a(是a的字首)連邊,然後topsort,bfs,如果有環一定是-1,否則就是bfs出的最長路

那麼連邊中的難點在與b如何向那些a連邊。考慮先對a,b的每個子串在sam上找到對應的結點位置,然後在同乙個結點中按長度從大到小為第一關鍵字,是a類串為第二關鍵字。

然後在結點中倒序迴圈,當前長度最長的b向其他點連邊。父親結點中的最長的b結點向當前點連邊。當前結點向所有小於等於當前結點最小b節點的點連邊。(聽著很麻煩,實現並不複雜)

**是抄的

#include #include #include #include #include #include using namespace std;

const int n = 8e5 + 100;

typedef long long ll;

char s[n];

int n, na, nb, cnt, tot, last, sz, m;

int ch[n][26], fa[n], f[n][26];

int in[n], a[n], b[n], len[n], pos[n];

int lst[n], h[n], isa[n];

ll dis[n];

struct edgee[n << 1];

vectorg[n];

void add(int u, int v) ; h[u]= cnt;

in[v]++;

}void insert(int x)

void find(int o)

bool cmp(int x,int y)

void solve()

lst[i] = last;

}for (int i = 2; i <= tot; i++) add(lst[fa[i]], i);

for (int i = 1; i <= sz; i++) if (!isa[i]) len[i] = 0;

scanf("%d", &m);

for (int i = 1; i <= m; i++)

bool flag = 0;

ll ans = 0;

queueq;

for (int i = 1; i <= sz; i++) if (!in[i]) q.push(i);

while (!q.empty())

}for (int i = 1; i <= sz; i++) if (in[i]) flag = 1;

if (flag) puts("-1");

else printf("%lld\n", ans);

for (int i = 1; i <= tot; i++) fa[i] = 0, memset(ch[i], 0, sizeof(ch[i]));

for (int i = 1; i <= sz; i++) in[i] = h[i] = dis[i] = len[i] = isa[i] = 0, g[i] = vector();

last = sz = tot = cnt = 0;

}int main()

十二省聯考 2019 字串問題

以前寫完題後鴿了部落格,現在補一下。今天下午機房的人在大螢幕上一直掛著 ioi 的榜,關注亞塞拜然那邊的比賽情況,我本來是衷心祝願中國隊能有人阿克 day1 的 zzq?然而六點後回來發現只有班傑明阿克了 實際上他還是三小時就阿克了 中國隊最高的是 zzq 和俄羅斯的 300iq 好像是並列第三?可...

十二省聯考2019 字串問題

首先,我們可以把題目轉變成這樣 對於一些a類串,其有連向某些b類串的邊 對於某些b類串,其又有連向某些a類串的邊。要你找出一條權值最長的路徑。此時顯然如果成環則答案一定是 1 a到b的串題目已經給出了,關鍵是b到a的串。我們發現,若某個 b 是 a 的字首,則 a 由 b 在後面新增字元得到,需要在...

十二省聯考 2019 字串問題 字尾陣列

十二省聯考 2019 字串問題 題意 給定乙個字串 s 並選取 n a 個子串作為 a 類串,選取 n b 個子串作為 b 類串,還給了 m 個支配關係 第 x 個 a 類串支配第 y 個 b 類串。請你求出最長串 t 的長度,t 滿足 t a a a 且 forall i in 1,k 1 a 支...