<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      runs 相關理論——2025.6.27 鮮花

      runs 相關理論

      內臓ありますか(請問有內臟嗎)
      悟った気がしたけど 結局 元の木阿彌である
      この世を俯瞰で見渡しても 肉體はジャンクフード食べる
      因果応報はなく 全ては塞翁が馬である
      何年経ってもいじめっこの君は 幸せそうだった
      言っても無駄 言われても無駄 無気力 無自覺 無関心なほど
      傷つくのを怖がった 愛さずに愛されたがった
      因果応報はなく 全ては塞翁が馬である
      天が見ていても 本當の邪悪は 邪悪のままだった
      今日も皆さん やりたくないこと ばかりやってますか(はい!)
      內心 舌打ちしながら ペコペコ頭 下げてますか(はい!)
      君は善人ですか?(はい!)
      やっぱり悪人ですか?(はい!)
      関係ないけど 今夜は楽しい パーティー行きますか?
      血も涙もないけど 優し気持ちも 足りないけど
      バラバラの思想 ぶつかっても 皆んな
      內臓ありますか? (はい!)
      君がいなくなっても よくあることだ と割り切っても
      身體が萎むくらい 泣いても みんな
      內臓ありますか?
      はい はい!
      はい はい!
      あっちが言うには被害者 でも こっちに言わせりゃ加害者
      両成敗という言葉使って 思考停止の傍観者
      因果応報はなく すべては塞翁が馬である
      喧々諤々やっても結局は 結果がすべてだった?
      今日もみなさん やりたくないことばかりやってますか はい
      たいして何にもやっていないのにマージンとりますか はい
      最近良いことあった? はい
      やっぱり嫌なことあった? はい
      関係ないけど 週末限定バーゲン行きますか
      夢を見失うけど 探せば ほんの少しあるけど
      最悪 売れば金になるけど みんな內臓ありますか はい
      外面が綺麗でも 醜い內面が嫌いでも
      生皮剝いだら おんなじだよ みんな
      內臓ありますか
      今日もみなさん やりたくないことばかりやってますか はい
      今日もみなさん やりたくないことばかりやってますか はい
      因果応報はなく すべては塞翁が馬である
      関係ないけど 大きな聲で叫んでくれますか
      血も涙もないけど 優しい気持ちも足りないけど
      バラバラの思想ぶつかっても みんな 內臓ありますか はい
      君がいなくなっても よくあることだと割り切っても
      身體が萎むくらい泣いても みんな 內臓ありますか はい
      君の幸せ どんくらいで そしてトラウマこんくらいで
      雨後のたけのこ背比べ 共感と嫌悪の雨あられ
      外面が綺麗でも 醜い內面が嫌いでも
      生皮剝いだら おんなじだよ みんな
      內臓ありますか
      はい はい
      はい はい
      

      很淺的一部分,模擬賽考了,所以寫一下。

      定義一個字符串 \(S\) 里的一個 run,指其內部一段兩側都不能擴展的周期子串,且周期至少完整出現兩次。

      容易發現一個 run 的每個長為 \(kp\) 的子串都是一個本原 \(k\) 次方串,并且每個本原 \(k\) 次方串至少位于一個 run 中。

      更嚴一點的,每個本原 \(k\) 次方串都可以被上述方式唯一統計到。考慮互相包含的 runs,其外層的 \(p\) 必然嚴格大于內層,且其外層周期不是內層倍數(這里的倍數是指字符串的倍數,而不是長度)。于是一個最小周期為 \(p\) 的本原 \(k\) 次方串必然只會被周期為 \(p\) 的 run 統計恰好一次。

      如何求 runs,一個簡單的寫法是用「優秀的拆分」中的調和級數分塊,可以 \(\mathcal{O}(|S| \log |S|)\) 求出。同時其一個顯然的個數下界是 \(\mathcal{O}(|S| \log |S|)\)

      但這個個數下界實在是很松,考慮一個更嚴的下界。

      我們發現,對于一個 run \((l, r, p)\),其一定包含 \(S[l\dots l + p - 1]\) 的所有循環位移,我們取出其中最小的循環位移,根據 lyndon 相關理論,其一定是一個 lyndon 串。

      為避免不必要的前置知識,我們直接再這里補充需要的 lyndon 知識:

      1. lyndon 串是一個串,滿足它所有真后綴都大于它。

      2. 當且僅當 \(s\) 的字典序嚴格小于它的所有非平凡的(非平凡:非空且不同于自身)循環同構串時,\(s\) 才是 Lyndon 串。

        證明,設 \(s\) 的后綴 \(t\) 小于 \(s\)

        \(t \le \left\lfloor\frac{s}2\right\rfloor\),則 \(s\) 可以表示為 \(tat\) 的形式,分討 \(s,t\) 大小可證其必不可能是嚴格最小。

        \(t > \left\lfloor\frac{s}2\right\rfloor\),設 \(s = ta\),則 \(t\) 存在 \(a\) 的周期,設 \(a = xy, t = (xy)^kx\)\(s = (xy)^kxxy\),分討 \(x,y\) 大小可證其必不可能是嚴格最小。

      我們證明一下 \(s\) 能循環位移不超過 \(|s| - 1\) 次和 \(s\) 相等當且僅當其不是本原串。

      考慮一個串 \(ab = ba\),其中 \(a,b\) 都是非空字符串且 \(|a| \le |b|\),我們有 \(a = b^k\),考慮歸納,將 \((ab)[|b| + 1\dots |a| + |b|]\) 歸納下去即可。

      我們稱取出的最小的循環位移是這個 run 的 lyndon 根。

      我們考慮到在第一個 lyndon 根處統計這個 run,設其是 \(S[i\dots i + p - 1]\)

      具體的,我們發現對于 \(j > i\)\(S\) 的后綴 \(S[j\dots |S|]\) 中,可能小于 \(S[i\dots |S|]\) 的最小的 \(j = i + p\),考慮 run 循環的性質,此時滿足 \(S[r + 1] > S[r - p + 1]\),我們直接以 \(i\) 和第一個比 \(S[i\dots |S|]\) 小的 \(S[k\dots |S|]\)\(k\) 組成的二元組 \((i, k)\) 進行擴展即可。

      如何統計 \(S[r + 1] < S[r - p + 1]\) 的呢?我們人為翻轉一下字典序,認為 \(a > b,b > c\)(注意空串大于所有串),然后再做即可。容易發現不存在 \(S[r + 1] = S[r - p + 1]\) 的。

      這證明了 runs 個數是 \(\mathcal{O}(n)\) 的且給出了另一種求 runs 的方式。

      實現的時候用 SA-IS + \(\mathcal{O}(n)-\mathcal{O}(1)\) st 表即可 \(\mathcal{O}(n)\)。當然也直接暴力二分 hash 加單調棧做到小常數 \(\mathcal{O}(n\log n)\)

      給出 hash 實現:

      Code
      /*
      ulimit -s 128000 && clear && g++ % -o %< -O2 -std=c++14 -DLOCAL -Wall -Wextra && time ./%< && size %<
      ulimit -s 128000 && clear && g++ % -o %< -O2 -std=c++14 -DLOCAL -Wall -Wextra -fsanitize=address,undefined -g && time ./%< && size %<
      echo && cat in_out/out.out && echo
      */
      #include <bits/stdc++.h>
      using namespace std;
      using llt = long long;
      using llf = long double;
      using ull = unsigned long long;
      #define endl '\n'
      #ifdef LOCAL
      FILE *InFile = freopen("in_out/in.in", "r", stdin), *OutFile = freopen("in_out/out.out", "w", stdout);
      #endif
       
      const int N = 1e6 + 3, Bs = 2333;
      
      namespace HS{
      	ull pw[N];
      	struct INIT{ INIT(){ pw[0] = 1; for(int i = 1; i <= N - 3; ++i) pw[i] = pw[i - 1] * Bs; } } Initer;
      	struct Hs{
      	private:
      		ull o[N];
      	public:
      		void In(char *s, int l){ for(int i = 0; i < l; ++i) o[i + 1] = o[i] * Bs + s[i]; }
      		ull operator()(int l, int r){ return o[r] - o[l - 1] * pw[r - l + 1]; }
      	};
      } using HS::Hs;
      
      Hs hs; char s[N]; int n;
      vector<tuple<int, int, int>> aas;
      
      int main(){
      	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
      	cin >> s + 1, n = strlen(s + 1), hs.In(s + 1, n);
      	auto Add = [](int a, int b){
      		if(s[a] != s[b]) return ;
      		int l = 1, r = a - 1, cl, cr;
      		while(l <= r){
      			int mid = (l + r) >> 1;
      			if(hs(a - mid, a) == hs(b - mid, b)) l = mid + 1;
      			else r = mid - 1;
      		}
      		cl = a - r, l = 1, r = n - b;
      		while(l <= r){
      			int mid = (l + r) >> 1;
      			if(hs(a, a + mid) == hs(b, b + mid)) l = mid + 1;
      			else r = mid - 1;
      		}
      		cr = b + r; int p = b - a;
      		if(cl > a - p && (cr - cl + 1) / p > 1) aas.emplace_back(cl, cr, p);
      	};
      	auto Cmp = [](int a, int b){
      		int l = 0, r = n - b;
      		while(l <= r){
      			int mid = (l + r) >> 1;
      			if(hs(a, a + mid) == hs(b, b + mid)) l = mid + 1;
      			else r = mid - 1;
      		}
      		if(l > n - b) return false;
      		else return s[a + l] < s[b + l];
      	};
      	stack<int> stk;
      	for(int i = n; i; --i){
      		while(!stk.empty() && Cmp(i, stk.top())) stk.pop();
      		if(!stk.empty()) Add(i, stk.top());
      		stk.emplace(i);
      	}
      	while(!stk.empty()) stk.pop();
      	for(int i = n; i; --i){
      		while(!stk.empty() && !Cmp(i, stk.top())) stk.pop();
      		if(!stk.empty()) Add(i, stk.top());
      		stk.emplace(i);
      	}
      	sort(aas.begin(), aas.end());
      	cout << aas.size() << endl;
      	for(auto [l, r, p] : aas) cout << l << ' ' << r << ' ' << p << endl;
      }
      

      考慮更進一步的理論:對于所有的 runs \((l, r, p)\),有 \(\sum \frac{r - l + 1}p \sim \mathcal{O}(n)\),證明就是上面的過程,我們每個 \(\frac{r - l + 1}p\) 其實都可以拆到 \((i, k)\) 上去,仔細分析可以的得到 \(|runs| < n,\sum \frac{r - l + 1}p < 3n\)

      P





      posted @ 2025-06-27 14:20  xrlong  閱讀(49)  評論(1)    收藏  舉報

      Loading

      主站蜘蛛池模板: 日本高清视频网站www| 豆国产97在线 | 亚洲| 日韩秘 无码一区二区三区 | 免费看欧美全黄成人片| 无码人妻精品一区二区三区夜夜嗨| 亚洲国产在一区二区三区| 国产国拍精品av在线观看| 艳妇乳肉豪妇荡乳在线观看| 亚洲а∨天堂久久精品2021| 国产亚洲精品第一综合| 老熟妇仑乱换频一区二区| 人妻精品久久久无码区色视| 奎屯市| 免费无码一区二区三区蜜桃| 日韩av天堂综合网久久| 欧美亚洲综合成人a∨在线| 国产999精品2卡3卡4卡| 大地资源高清免费观看| 午夜免费无码福利视频麻豆| 国产精品成人一区二区不卡 | 亚洲精品韩国一区二区| 胸大美女又黄的网站| 人妻少妇偷人精品视频| 中文字幕日韩有码av| 欧美精品v国产精品v日韩精品| 中文字幕人妻无码一区二区三区| 国产一区二区三区黄色大片| 老太脱裤让老头玩ⅹxxxx| 日本福利一区二区精品| 久久波多野结衣av| 丰满少妇又爽又紧又丰满在线观看| 陈巴尔虎旗| 国产精品三级爽片免费看| 伊人久久大香线蕉AV网禁呦| 四虎永久地址www成人| 丰满巨乳淫巨大爆乳| 国产精品v片在线观看不卡| 老湿机69福利区无码| 亚洲卡1卡2卡3精品| 国产精品午夜精品福利| 欧美牲交40_50a欧美牲交aⅴ|