bzoj4199: [Noi2015]品酒大會

題面見http://uoj.ac/problem/131

一道后綴數組題

先求出height,然后從大到小枚舉每個height。

然后對于每個height值,兩端的集合中任意一對后綴的LCP都是這個height。

我們統計答案之后合并兩端的集合,用并查集維護即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define maxn 300005
 7 #define inf 1LL<<62
 8 using namespace std;
 9 typedef long long int64;
10 char ch,s[maxn];
11 int n,val[maxn];
12 int64 ans[2][maxn];
13 int fa[maxn],siz[maxn],list[maxn],max_val[maxn],min_val[maxn];
14 int SA[maxn],rank[maxn],height[maxn],sum[maxn],t1[maxn],t2[maxn];
15 bool cmp(int x,int y){
16     if (height[x]!=height[y]) return height[x]>height[y];
17     return x<y;
18 }
19 bool ok;
20 void read(int &x){
21     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
22     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
23     if (ok) x=-x;
24 }
25 void get_SA(){
26     int *x=t1,*y=t2,m=255,tot=0;
27     for (int i=1;i<=n;i++) sum[x[i]=s[i]]++;
28     for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
29     for (int i=n;i>=1;i--) SA[sum[x[i]]--]=i;
30     for (int len=1;tot<n;len<<=1,m=tot){
31         tot=0;
32         for (int i=n-len+1;i<=n;i++) y[++tot]=i;
33         for (int i=1;i<=n;i++) if (SA[i]>len) y[++tot]=SA[i]-len;    
34         for (int i=1;i<=m;i++) sum[i]=0;
35         for (int i=1;i<=n;i++) sum[x[y[i]]]++;
36         for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
37         for (int i=n;i>=1;i--) SA[sum[x[y[i]]]--]=y[i];
38         swap(x,y),x[SA[1]]=tot=1;
39         for (int i=2;i<=n;i++){
40             if (y[SA[i]]!=y[SA[i-1]]||y[SA[i]+len]!=y[SA[i-1]+len]) tot++;
41             x[SA[i]]=tot;    
42         }
43     }
44     for (int i=1;i<=n;i++) rank[i]=x[i];
45 }
46 void get_height(){
47     for (int i=1,j=0;i<=n;i++){
48         if (rank[i]==1) continue;
49         while (s[i+j]==s[SA[rank[i]-1]+j]) j++;
50         height[rank[i]]=j;
51         if (j>0) j--;
52     }    
53 }
54 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
55 void merge(int x,int y){
56     siz[y]+=siz[x];
57     max_val[y]=max(max_val[y],max_val[x]);
58     min_val[y]=min(min_val[y],min_val[x]);
59     fa[x]=y;    
60 }
61 int main(){
62     read(n);
63     scanf("%s",s+1);
64     get_SA(),get_height();
65     for (int i=1;i<=n;i++) read(val[i]);
66     for (int i=1;i<=n;i++) max_val[i]=val[SA[i]];
67     for (int i=1;i<=n;i++) min_val[i]=val[SA[i]];
68     for (int i=1;i<=n;i++) fa[i]=i;
69     for (int i=1;i<=n;i++) siz[i]=1;
70     for (int i=1;i<n;i++) list[i]=i+1;
71     for (int i=1;i<=n;i++) ans[1][i]=-inf;
72     sort(list+1,list+n,cmp);
73     for (int i=1;i<n;i++){
74         int x=find(list[i]-1),y=find(list[i]);
75         ans[0][height[list[i]]]+=1LL*siz[x]*siz[y];
76         ans[1][height[list[i]]]=max(ans[1][height[list[i]]],1LL*max_val[x]*max_val[y]);
77         ans[1][height[list[i]]]=max(ans[1][height[list[i]]],1LL*max_val[x]*min_val[y]);
78         ans[1][height[list[i]]]=max(ans[1][height[list[i]]],1LL*min_val[x]*max_val[y]);
79         ans[1][height[list[i]]]=max(ans[1][height[list[i]]],1LL*min_val[x]*min_val[y]);
80         merge(x,y);
81     }
82     for (int i=n-2;i>=0;i--) ans[0][i]+=ans[0][i+1],ans[1][i]=max(ans[1][i],ans[1][i+1]);
83     for (int i=0;i<n;i++) printf("%lld %lld\n",ans[0][i],ans[0][i]?ans[1][i]:0);
84     return 0;
85 }

?

轉載于:https://www.cnblogs.com/chenyushuo/p/4733941.html

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

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

相關文章

css中position初解

positon:static|absolute|relative|fiexd 1、static為默認值&#xff0c;沒有定位&#xff0c;元素出現在正常的文檔流中&#xff0c;忽略left,right,top,bottom,i-index值。 2、absolute為絕對定位&#xff0c;通過left,top等值對元素進行定位&#xff0c;定位時如果父元素的p…

零XML的Spring配置

Tomasz Nurkiewicz是我們的JCG合作伙伴之一&#xff0c;也是Spring框架的堅定支持者&#xff0c;在他的最新文章中描述了如何在不使用XML的情況下配置Spring應用程序。 注解方法在頂部。 查看他的教程&#xff1a; 沒有XML的Spring框架...根本&#xff01; 翻譯自: https://ww…

用動畫切換按鈕的狀態

用動畫切換按鈕的狀態 效果 源碼 https://github.com/YouXianMing/UI-Component-Collection // // BaseControl.h // BaseButton // // Created by YouXianMing on 15/8/27. // Copyright (c) 2015年 YouXianMing. All rights reserved. //#import <UIKit/UIKit.h> c…

iOS開發之學前了解

學iOS開發能做什么&#xff1f; iOS開發需要學習哪些內容&#xff1f; 先學習什么&#xff1f; 不管你是學習android開發還是iOS開發 都建議先學習UI&#xff0c;原因如下&#xff1a; UI是app的根基&#xff1a;一個app應該是先有UI界面&#xff0c;然后在UI的基礎上增加實用功…

力扣gupiao

給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的最大利潤。…

Java相當好的隱私(PGP)

公鑰加密 這篇文章討論了PGP或“很好的隱私”。 PGP是常規加密和公用密鑰加密的混合實現。 在詳細介紹PGP之前&#xff0c;讓我們先談談公鑰加密。 與其他任何加密技術一樣&#xff0c;公鑰加密解決了通過不安全介質傳輸安全數據的問題。 即互聯網。 結果&#xff0c;該方案的…

HDU 5691 Sitting in Line 狀壓dp

Sitting in Line題目連接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5691 Description 度度熊是他同時代中最偉大的數學家&#xff0c;一切數字都要聽命于他。現在&#xff0c;又到了度度熊和他的數字仆人們玩排排坐游戲的時候了。游戲的規則十分簡單&#xff0c…

hello oc

printf("Hello C\n"); //OC可以采用C語言的輸出方式 printf("The number is %d\n",100);//%d 輸出數字 printf("Hello %s\n","XiaoMing");//%s 輸出字符 NSLog("Hello Objective-C"); //采用oc的輸出&#xff0c;前面帶了一…

Spring3 RESTful Web服務

Spring 3提供了對RESTful Web服務的支持。 在本教程中&#xff0c;我們將向您展示如何在Spring中實現RESTful Web服務 &#xff0c;或者如何將現有的Spring服務公開為RESTful Web服務 。 為了使事情變得更有趣&#xff0c;我們將從上一篇關于Spring GWT Hibernate JPA Infinisp…

zoj 3765 塊狀鏈表 OR splay

各種操作o(╯□╰)o...不過都挺簡單&#xff0c;不需要lazy標記。 方法1&#xff1a;塊狀鏈表 塊狀鏈表太強大了&#xff0c;區間操作實現起來簡單暴力&#xff0c;效率比splay稍微慢一點&#xff0c;內存開銷小很多。 1 #include <iostream>2 #include <cstring>3…

【C#公共幫助類】 Image幫助類

大家知道&#xff0c;開發項目除了數據訪問層很重要外&#xff0c;就是Common了&#xff0c;這里就提供了強大且實用的工具。 【C#公共幫助類】 Convert幫助類 Image類&#xff1a; using System; using System.Collections.Generic; using System.Text; using System.IO; usin…

Java泛型快速教程

泛型是Java SE 5.0引入的一種Java功能&#xff0c;在其發布幾年后&#xff0c;我發誓那里的每個Java程序員不僅聽說過它&#xff0c;而且已經使用過它。 關于Java泛型&#xff0c;有很多免費和商業資源&#xff0c;而我使用的最佳資源是&#xff1a; Java教程 Java泛型和集合…

876. 鏈表的中間結點

給定一個頭結點為 head 的非空單鏈表&#xff0c;返回鏈表的中間結點。 如果有兩個中間結點&#xff0c;則返回第二個中間結點 代碼一&#xff1a; 自己想的一個方法 class Solution {public ListNode middleNode(ListNode head) {ListNode p1 head;ListNode p2 head;//i,j…

Hive查詢Join

Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.keyb.key); 現有兩張表&#xff1a;sales 列出了人名及其所購商品的 ID&#xff1b;things 列出商品的 ID 和名稱&#xff1a; hive> select * from sales; OK Joe 2 Hank 4 Ali 0 Eve 3 Ha…

jquery 獲取easyui combobox選中的值

$(#comboboxlist).combobox(getValue);轉載于:https://www.cnblogs.com/ftm-datablogs/p/5526857.html

調度Java應用程序中的主體

許多項目需要計劃功能&#xff0c;例如我們計劃的工作&#xff0c;重復的工作&#xff0c;異步執行等。 我們的首選方法是使用企業工作調度程序&#xff0c;例如OpenSymphony的Quartz。 使用計劃任務進行編碼時&#xff0c;最棘手的部分之一是執行部分。 這里的主要經驗法則是…

繼承映射關系 joinedsubclass的查詢

會出現下面這樣的錯一般是配置文件中的mapping和映射文件中的package路徑或者class中的name路徑不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(Sessi…

Spark系列—02 Spark程序牛刀小試

一、執行第一個Spark程序 1、執行程序 我們執行一下Spark自帶的一個例子&#xff0c;利用蒙特卡羅算法求PI&#xff1a; 啟動Spark集群后&#xff0c;可以在集群的任何一臺機器上執行一下命令&#xff1a; /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM選項:-client vs -server

您是否曾經在運行Java應用程序時想知道-client或-server開關是什么&#xff1f; 例如&#xff1a; javaw.exe -client com.blogspot.sdoulger.LoopTest也顯示在java.exe的“幫助”中&#xff0c;例如&#xff0c;其中的選項包括&#xff1a; -client選擇“客戶端” VM -serv…

網頁前臺小知識

1.左右布局div塊自適應&#xff0c;首先外邊套一個div,把寬度固定一個px&#xff0c;然后margin設為&#xff10; atuo&#xff1b;這樣他會根據窗口大小自動變換左右距離&#xff0e;就這么簡單&#xff1c;/p> 2.多個標簽共用一個樣式&#xff0c;用&#xff0c;分隔開 p…