Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后綴數組+平衡樹+字符串)

這題做得比較復雜。。應該有更好的做法

題目大意:

有一個括號序列,可以對其進行兩種操作:

·????????向里面加一個括號,可以在開頭,在結尾,在兩個括號之間加。

·????????對當前括號序列進行循環移動,即把最后一個括號拿到開頭來。

上述兩種操作可以做任意次,要求添加最少的括號使得原序列變成一個合法括號序列。如果有多種可能,輸出字典序最小的那一個。"("?<?")"。

?

題解:

首先計算左括號和右括號的數量,可以知道,不妨假設左括號的數量大于右括號

那么最少的方案就是在字符串右側補充右括號,使得左括號的數量等于右括號的數量。

但是一個方案是否可行,要使得前面的每個前綴,都滿足條件左括號的數量大于右括號

如果不滿足,就循環移動即可,通過循環移動就一定會找到一個方案。

要輸出字典序最小的方案,就需要后綴數組了

把字符串循環復制一遍,做后綴數組,那么就知道每個方案的排名

找最小且可行的方案輸出即可。

另一種情況是左括號的數量小于右括號,也是同理的。

?

關于如何判斷是否可行,這里是用的平衡樹

寫出每個位置的條件,每移動一次,對所有的條件影響都是相同的,所以用平衡樹維護這些條件即可

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int maxn = 2e6 + 1000;
int Wa[maxn], Wb[maxn], Wv[maxn], Ws[maxn], sa[maxn];
int Rank[maxn];
int height[maxn];
set<int> S;
map<int, int> M;
vector<int> V;
int a[maxn];
int cmp(int *r, int a, int b, int l)
{return r[a]==r[b] && r[a+l]==r[b+l];
}
void get_sa(int *r, int *sa, int n, int m)
{int i,j,p,*x=Wa,*y=Wb,*t;for(i=0; i<m; i++) Ws[i]=0;for(i=0; i<n; i++) Ws[x[i]=r[i]]++;for(i=1; i<m; i++) Ws[i]+=Ws[i-1];for(i=n-1; i>=0; i--) sa[--Ws[x[i]]]=i;for(p=1,j=1; p<n; j*=2,m=p){for(p=0,i=n-j; i<n; i++) y[p++]=i;for(i=0; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0; i<n; i++) Wv[i]=x[y[i]];for(i=0; i<m; i++) Ws[i]=0;for(i=0; i<n; i++) Ws[Wv[i]]++;for(i=1; i<m; i++) Ws[i]+=Ws[i-1];for(i=n-1; i>=0; i--) sa[--Ws[Wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}
}
void get_height(int *r, int *sa, int n)
{int i, j, k=0;for(i=1; i<=n; i++) Rank[sa[i]]=i;for(i=0; i<n; height[Rank[i++]]=k)for(k?k--:0,j=sa[Rank[i]-1]; r[i+k]==r[j+k]; k++);
}void Hinsert(int x){if(M[x] == 0) S.insert(x);M[x]++;
}
void Herase(int x){if(M[x] == 1) S.erase(x);M[x]--;
}
char str[maxn];
int tr, tl;
int main()
{cin>>str;int n = strlen(str), nl = 0, nr = 0;for(int i = 0; i < n; i++){if(str[i] == '(') nl++, str[i] = 1;else nr++, str[i] = 2;}if(nl < nr){tl = 0;for(int i = n-1; i >= 0; i--){if(str[i] == 1) tl++;a[i] = 2*tl-(n-i);Hinsert(-a[i]);}tl = 0;for(int i = n-1; i >= 0; i--){if(-(*S.begin()) <= -(n-i-1)+2*tl) V.push_back(i);Herase(-a[i]);if(str[i] == 1) tl++;Hinsert(-(2*nl-n-(n-i)+2*tl));}int N = 2*n-1;for(int i = 0; i < n; i++) a[i] = str[i];for(int i = n; i < N; i++) a[i] = str[i-n];get_sa(a, sa, N+1, 4);for(int i = 1; i <= N; i++) Rank[sa[i]] = i;int maxr = N+100, Kr = 0;for(auto i : V){if(i+1 >= N) break;if(Rank[i+1] < maxr){maxr = Rank[i+1];Kr = i+1;}}a[N] = a[N-n];for(int i = 0; i < nr-nl; i++) printf("(");for(int i = Kr; i < Kr+n; i++) printf("%c", a[i] == 2 ? ')' : '(');} else {tr = 0;for(int i = 0; i < n; i++){if(str[i] == 2) tr++;a[i] = 2*tr-i-1;Hinsert(-a[i]);}tr = 0;for(int i = 0; i < n; i++){if(-(*S.begin()) <= -i+2*tr) V.push_back(i);Herase(-a[i]);if(str[i] == 2) tr++;Hinsert(-(2*nr-n-i-1+2*tr));}int N = 2*n-1;for(int i = 0; i < n; i++) a[i] = str[i];for(int i = n; i < N; i++) a[i] = str[i-n];get_sa(a, sa, N+1, 4);for(int i = 1; i <= N; i++) Rank[sa[i]] = i;int maxr = N+100, Kr = 0;for(auto i : V){if(Rank[i] < maxr){maxr = Rank[i];Kr = i;}}for(int i = Kr; i < Kr+n; i++) printf("%c", a[i] == 2 ? ')' : '(');for(int i = 0; i < nl-nr; i++) printf(")");}
}

?

轉載于:https://www.cnblogs.com/Saurus/p/7591531.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Filecoin源碼倉庫全解析】第一章:搭建Filecoin測試節點

2019.2.14 情人節&#xff0c;Filecoin項目開放了核心源碼倉庫go-filecoin&#xff0c;并更新了 filecoin-project organization下的諸多核心成果&#xff0c;這意味著&#xff0c;Filecoin已然度過了最困難的難點攻關期&#xff0c;進入到了全民公測階段。 本系列文章將協助大…

DNS 代理?Pipy:這我也可以

Pipy 是個可編程代理&#xff0c;曾經我們做過 TCP/HTTP 代理、MQTT 代理、Dubbo 代理、Redis 代理、Thrift 代理。前幾天有人問 DNS[1] 的代理能不能做&#xff1f;當然可以&#xff0c;而且 DNS 代理已經應用在 跨集群流量調度 中&#xff0c;文末經對此進行簡單地介紹。閱讀…

如何在Windows中快速輕松地將文件發送到SkyDrive

We have already shown you how you can share external folders with your SkyDrive, but what if you actually want to copy a file or folder into your SkyDrive folder? Of course copying and pasting is nowhere near geeky enough, so here’s how to add a SkyDrive…

性能測試一些相關的概念

1.壓測任務需求的確認 確定好工作范圍&#xff1a; 首先分析壓測最容易出現瓶頸的地方&#xff0c;有目的的進行測試。 用戶更關心整個系統中哪個環節的性能情況也會影響工作范圍。2. 壓力測試 通過不斷加壓被測系統&#xff0c;直到性能指標達到飽和&#xff0c;這種測試能夠找…

阿里云雙11全球狂歡節 計算資源買買買

本文講的是阿里云雙11全球狂歡節 計算資源買買買【IT168資訊】除了喜歡屯奶粉和運動裝備的消費者外&#xff0c;創業者也能加入雙11“買買買”狂歡。11月2日&#xff0c;阿里云宣布加入天貓雙11全球狂歡節&#xff0c;全線計算資源產品在官網狂歡售賣&#xff0c;與創業者共同打…

windows刪除桌面ie_從Windows 8“開始”屏幕啟動IE的桌面版本

windows刪除桌面ieThere are two versions of Internet Explorer in Windows 8, one you can only launch from the Start Screen and the Desktop version which you can only launch from the Desktop. Lets look at how we can launch the Desktop version from the Start S…

如何讓程序跑起來――第三章

下面是我看完第三章之后總結出來的知識點&#xff1a;整數和小數沒有太大的差別&#xff0c;是因為計算機內部所有信息都是以二進制數的形式來處理的&#xff0c;但使用二進制表示整數和小數的方法基本相同&#xff0c;比如小數點前和小數點后將個數位的數值和位全相乘的結果相…

.NET Conf China 2022 圓滿落幕,明年再見!

時光飛快&#xff0c;還記得本月的第一個周末嗎&#xff1f;12月3日-12月4日&#xff0c;相信對于 .NET 開發者來說一定記憶猶新&#xff01;.NET Conf China 2022 于12月4日圓滿落幕。八方助力共譜大會盛宴.NET Conf China 2022 是一個社區性質的技術峰會&#xff0c;本次大會…

移動端手指操控左右滑動的菜單

<!DOCTYPE html> <html lang"en"> <head> <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0"> <meta charset"UTF-8"> <title>移動端…

馬哥linux高薪中級-DNS

第一章 簡介一、DNSdomain name server&#xff0c;用來將計算機名稱或者域名解析成ip地址的服務協議。用戶在使用域名訪問時會先通過DNS服務請求域名對應的ip地址&#xff0c;然后緩存下來&#xff0c;然后才通過ip地址進行通信。最初域名解析是通過HOSTS文件來靜態綁定的。DN…

愚蠢的怪胎技巧:通過命令行管理SkyDrive

Originally launched as an April Fools prank by the Microsoft SkyDrive team, SkyCMD turned out to be a really geeky way to manage files and folders on your SkyDrive from the command line. Lets take a quick look. SkyCMD最初是由Microsoft SkyDrive團隊以愚人節惡…

關于vue父子組件之間事件觸發及數據傳遞問題

父組件&#xff1a;1&#xff0c;引入子組件2&#xff0c;ref 3&#xff0c;需要更新數據操作的地方 子組件&#xff1a;1&#xff0c;定義同名事件&#xff0c;拿到數據執行相關操作

.NET Core如何通過認證機制訪問Kafka?

【.NET Core】| 總結/Edison Zhou大家好&#xff0c;我是Edison。最近有一個ASP.NET Core使用認證機制訪問Kafka的需求&#xff0c;加之我們又使用了CAP這個開源項目使用的Kafka&#xff0c;于是網上尋找了一番發現對應資料太少&#xff0c;于是調查了一番&#xff0c;做了如下…

JQuery框架2.位置屬性|篩選方法|事件

1、位置屬性 jquery的css position獲取匹配元素相對父元素的偏移位置&#xff1b;offset獲取匹配元素在當前視口的相對偏移,返回的對象包含兩個整型屬性&#xff1a;top 和 left $("p").offset() $(div).offset().top $("p").offset().left scrollTop獲取匹…

新手學習Java必需要知道的這些基本概念!

學習好比蓋房子&#xff0c;打地基好很重要&#xff0c;房了能蓋多高關鍵看地基&#xff1b;學習同樣道理&#xff0c;基礎知識是以后學習一切技術的必要條件&#xff0c;我們在準備學習一門開發語言時&#xff0c;首先要學習它的基礎&#xff0c;不僅要會&#xff0c;更要融會…

jenkins沒安裝git報錯

Jenkins新建項目中源碼管理使用Git時遇到如下問題&#xff1a; 在安裝jenkins服務器上查看一下git版本&#xff0c;可能沒有安裝git 也可能是git版本太低 [rootlocalhost nnnnn]# git --version git version 1.8.3.1 yum安裝的版本太低了 打開Jenkins的 主頁面 > 系統管理 …

如何使用 IdGen 生成 UID

在分布式系統中&#xff0c;雪花 ID 是一種常用的唯一 ID 生成算法。它通過結合時間戳、機器碼和自增序列來生成 64 位整數 ID&#xff0c;可以保證 ID 的唯一性和順序性。在.Net 項目中&#xff0c;我們可以使用 IdGen 這個類庫來生成雪花 ID。它是一個開源的類庫&#xff0c;…

mac 不能連接wi-fi_如何在Mac OS X中查看當前的Wi-Fi連接速度

mac 不能連接wi-fiEver since I’ve been using my new MacBook Air, I’ve been befuddled by how to do some of the simplest tasks in Mac OS X that I would normally do from my Windows laptop—like show the connection speed for the current Wi-Fi network. So am I…

User Stories - 最佳實踐 (Best Practices)

在轉向敏捷之后&#xff0c;很多團隊開始使用“用戶故事”一詞。用戶故事是一種簡單而優雅的技術&#xff0c;可以收集客戶需求。然而&#xff0c;它需要一定的理解和實踐才能用User Stories構建出色的軟件。 讓我們仔細看看用戶故事是什么以及如何使用這種技術取得成功。 什么…

聊一聊promise的前世今生

promise的概念已經出現很久了&#xff0c;瀏覽器、nodejs都已經全部實現promise了。現在來聊&#xff0c;是不是有點過時了&#xff1f; 確實&#xff0c;如果不扯淡&#xff0c;這篇隨筆根本不會有太多內容。所以&#xff0c;我就盡可能的&#xff0c;多扯一扯&#xff0c;聊一…