bzoj4566 找相同字元

2022-04-30 11:18:10 字數 1378 閱讀 6596

題意:給定兩個字串,從中各取乙個子串使之相同,有多少種取法。允許本質相同。

解:建立廣義字尾自動機,對於每個串,分別統計cnt,之後每個點的cnt乘起來。記得開long long

1 #include 2 #include 3 #include 4

5 typedef long

long

ll;6

const

int n = 800010;7

8struct

edge edge[n << 1]; int

top;

1112

int tr[n][26], len[n], fail[n], cnt[n][2

], vis[n];

13int tot = 1

, last, turn, e[n];

14char

s[n], str[n];

1516 inline void add(int x, int

y) 23

24 inline int split(int p, int

f) 34

return

nq;35}36

37 inline int insert(int p, char

c) 45

int t =split(p, f);

46 cnt[t][turn] = 1;47

return

t;48}49

int np = ++tot;

50 len[np] = len[p] + 1

;51 cnt[np][turn] = 1;52

while(p && !tr[p][f])

56if(!p)

59else

64else67}

68return

np;69}70

71void dfs(int

x) 78

return;79

}8081int

main()

87 n =strlen(str);

88 last = turn = 1;89

for(int i = 0; i < n; i++)

92for(int i = 2; i <= tot; i++)

95 dfs(1

);96

int p = 1

;97 ll ans = 0;98

for(int i = 2; i <= tot; i++)

101102 printf("

%lld

", ans);

103return0;

104 }

ac**

BZOJ4566 找相同字元(字尾陣列)

bzoj 字尾陣列的做法,應該不是很難想 首先看到兩個不同的串,當然是接在一起求sa hei ght 那麼,考慮一下暴力 在兩個串各列舉乙個字尾,他們的lc p 就是對答案產生的貢獻 現在優化一下,按照sa 的順序列舉來處理lc p 利用乙個單調棧維護一下,每次記錄一下前面有多少個的貢獻和當前答案一...

BZOJ 4566 找相同字串

題意 給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩個子串中有乙個位置不同。題目已經給的很明白了好嘛?串長n 2 10 5n leq 2 times 10 5 n 2 10 5sol 先考慮n 3n 3 n3暴力,分別列舉串1和串2字尾的左端點,然後...

BZOJ4566 找相同字元(字尾自動機)

bzoj 看到多串處理,sa 就連起來 sa m?單串建自動機 然後其他串匹配 對於乙個串建完sa m 後 另乙個串在sa m 上匹配 記錄當前匹配的最大長度 匹配了當前位置的話,就能產生一定的貢獻 但是很顯然,沿著pa rent 往上,所有點都能夠產生貢獻 所以匹配完再沿著pa rent 做一遍類...