洛谷P5108 仰望半月的夜空(尾碼數組)

来源:https://www.cnblogs.com/zwfymqz/archive/2019/03/28/10612560.html
-Advertisement-
Play Games

題意 "題目鏈接" Sol warning:下麵這個做法只有95分,本地拍了1w+組都沒找到錯誤我表示十分無能為力 我們考慮每個串的排名去更新答案,顯然排名為$1$的尾碼的首碼一定是當前長度的字典序最小的答案,但不一定是左端點最小的答案,因此還需要用一個數據結構去維護一下所有可行的左端點。然後枚舉所 ...


題意

題目鏈接

Sol

warning:下麵這個做法只有95分,本地拍了1w+組都沒找到錯誤我表示十分無能為力

我們考慮每個串的排名去更新答案,顯然排名為\(1\)的尾碼的首碼一定是當前長度的字典序最小的答案,但不一定是左端點最小的答案,因此還需要用一個數據結構去維護一下所有可行的左端點。然後枚舉所有尾碼更新答案就行了。

#include<bits/stdc++.h> 
using namespace std;
const int MAXN = 2e6 + 10, SS = 6e5 + 10, INF = 1e9 + 10;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int CharSet, N, M, ans[SS];
int s[SS]; char stmp[SS];
int rak[SS], tp[SS], tax[MAXN * 10], sa[SS], height[SS];
void Sort() {
    for(int i = 0; i <= M; i++) tax[i] = 0;
    for(int i = 1; i <= N; i++) tax[rak[i]]++;
    for(int i = 1; i <= M; i++) tax[i] += tax[i - 1];
    //for(int i = N; i >= 1; i--) sa[i] = tp[tax[rak[i]]--];
    for(int i = N; i >= 1; i--) sa[tax[rak[tp[i]]]--] = tp[i];
}
void SuffixArraryBuild() {
    M = CharSet;
    for(int i = 1; i <= N; i++) rak[i] = s[i], tp[i] = i;
    Sort();
    for(int w = 1, p; w < N; w <<= 1, M = p) {
        p = 0;
        for(int i = N - w + 1; i <= N; i++) tp[++p] = i;
        for(int i = 1; i <= N; i++) if(sa[i] > w) tp[++p] = sa[i] - w;
        Sort(); swap(rak, tp);
        rak[sa[1]] = p = 1; 
        for(int i = 2; i <= N; i++) 
            rak[sa[i]] = (tp[sa[i]] == tp[sa[i - 1]] && tp[sa[i] + w] == tp[sa[i - 1] + w] ? p : ++p);
    }
    for(int i = 1, k = 0; i <= N; i++) {
    
        int j = sa[rak[i] - 1];
        if(k) k--;
        while(j && s[i + k] == s[j + k]) k++;//mmp一開始沒寫j.. 
            height[rak[i]] = k;//tag
    }
}
#define ls k << 1
#define rs k << 1 | 1
int mn[MAXN];
void update(int k) {
    mn[k] = min(mn[ls], mn[rs]);
}
void Build(int k, int l, int r) {
    if(l == r) {mn[k] = sa[l]; return ;}
    int mid = l + r >> 1;
    Build(ls, l, mid); Build(rs, mid + 1, r);
    update(k);
}
int IntQuery(int k, int l, int r, int ql, int qr) {
    if(ql <= l && r <= qr) return mn[k];
    int mid = l + r >> 1;
    if(ql > mid) return IntQuery(rs, mid + 1, r, ql, qr);
    else if(qr <= mid) return IntQuery(ls, l, mid, ql, qr);
    else return min(IntQuery(ls, l, mid, ql, qr), IntQuery(rs, mid + 1, r, ql, qr));
}
int f[MAXN][20];
int Find(int pos, int cur) {//從pos開始的height,第一個 < cur的位置 
    if(height[pos] < cur) return pos - 1;
    for(int i = 19; i >= 1; i--) {
        while(f[pos][i] >= cur && f[pos][i] <= INF && pos + (1 << i) - 1 <= N) 
            pos = pos + (1 << i) - 1;
    }
    return pos;
}

void solve() {
    Build(1, 1, N);
    memset(f, 0x3f, sizeof(f));
    for(int i = 1; i <= N; i++) f[i][0] = height[i];
    for(int j = 1; j <= 19; j++) 
        for(int i = 1; i + (1 << j) - 1<= N; i++) 
            chmin(f[i][j], min(f[i][j - 1], f[i + (1 << j - 1)][j - 1]));
    
    
    int cur = 1;//馬上要找的答案 
    for(int rk = 1; rk <= N; rk++) {
        if((N - sa[rk] + 1) < cur) continue;
        int pos = sa[rk];
        for(int i = pos + cur - 1; i <= N; i++) {
            int j = Find(rk + 1, cur);
            ans[cur++] = IntQuery(1, 1, N, rk, j);
        }
    }
}
signed main() {
    CharSet = read(); N = read();
    if(CharSet == 26) {
        scanf("%s", stmp + 1);
        for(int i = 1; i <= N; i++) s[i] = stmp[i] - 'a';
    }
    else for(int i = 1; i <= N; i++) s[i] = read();
    SuffixArraryBuild();
    solve();
    for(int i = 1; i <= N; i++) cout << ans[i] << ' ';
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 經過一個月來的學習,我從對面向對象一無所知到逐漸入門,圍繞著“多項式求導”,對面向對象的特性進行了探索。 我對面向對象印象最深的兩句話就是“萬物皆對象”和“高內聚、低耦合”,這三次作業也是儘量貫徹了這兩句話。 我們的作業從第一次的僅含冪函數的求導,到第二次包含正餘弦函數,再到最後函數可以嵌 ...
  • 一. 基於度量的程式結構分析 1. 第一次作業 這次作業是我上手的第一個java程式,使用了4個類來實現功能。多項式採用兩個arraylist來存,繫數和冪指數一一對應。 四個類分別為 Poly類,代表表達式; PolyDiff類,代表求導運算; PolyParse類,封裝了格式檢查,encodin ...
  • 前言 好的代碼需要有高內聚、低耦合、易擴展且擴展改動小等特點。說實話,我入行很久之後,才知道這些設計原則的名字,但是我並不覺得陌生,反而有一種理所當然的感覺。這得感謝自學時網路上前輩們推薦的書籍,培養了自己的代碼潔癖,還得感謝轉行後的第一個東家!以下只是我的理解,如有錯誤,請指正。 單一職責原則 顧 ...
  • return語句 return語句用來從一個函數中 返回 即跳出函數。當然也可以從函數中返回一個值。 運行結果 DocStrings Python有一個很奇妙的特性,稱為 文檔字元串 ,它通常被簡稱為 docstrings 。DocStrings是一個重要的工具,由於它幫助你的程式文檔更加簡單易懂, ...
  • 列表[List] 元組(truple) 字典{dict} 生成器(generator) 帶有 yield 的函數在 Python 中被稱之為 generator(生成器) 迭代器 iterator 迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代 ...
  • 預設參數 對於參數有時候我們希望他是可選的,前面介紹了函數柯里化,當然還有其他的解決方案。如果不想給某些參數提供值的話,就讓這寫參數使用預設值。在函數定義的時候給參數賦值使用(參數,參數=值......),從而給形參指定預設值。 註意預設參數的值是一個不可變的參數(也就是說預設參數是一個確定的值)。 ...
  • 有時候,我們想要獲取一個對象關聯關係的數量,但是我們不要所有的關聯對象,我們只想要符合規則的那些關聯對象的數量。 ...
  • 爬蟲背景 爬蟲最核心的問題就是解決重覆操作,當一件事情可以重覆的進行的時候,就可以用爬蟲來解決這個問題,今天要實現的一個基本需求是完成“博客園“ 博客的自動評論,其實原理是非常簡單的,提煉一下需求 基本需求 1. 登錄博客園 2. 調用評論介面 3. 返回請求結果 確定流程之後,基本就是找突破口的環 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...