[Educational Round 5][Codeforces 616F. Expensive Strings]

這題調得我心疲力竭...Educational Round 5就過一段時間再發了_(:з」∠)_

先后找了三份AC代碼對拍,結果有兩份都會在某些數據上出點問題...這場的數據有點水啊_(:з」∠)_【然而卡掉本弱還是輕輕松松的】

題目鏈接:616F - Expensive Strings

題目大意:給出\(n\)個字符串\(t_i\)以及\(n\)個數\(c_i\),定義\(p_{s,i}\)為字符串\(s\)在\(t_i\)中出現的次數,\(f(s)=\sum_{i=1}^{n}c_i\cdot p_{s,i}\cdot |s|\),求\(f(s)\)的最大值

題解:考慮將\(n\)個字符串用互不相同的字符串連接起來,并求出新串的后綴數組。對于一段連續且合法(對任意i,有sa[i]對應的字符不為連接符)的區間\([l,r]\),其對應的答案就為\(min\left \{ height_i \right \}\cdot \sum c_j\),\(j\)為sa[i]所屬原字符串的編號,對應所取的字符串就是這連續幾個后綴的最長公共子串。因此若考慮暴力枚舉所有的合法區間,會有下面的代碼

for(int l=1;l<=len_sum;l++)if(s[sa[l]-1]>N)for(int r=l;r<=len_sum;r++)if(s[sa[r]-1]<N)break;else{LL k=0;int mi=N;for(int i=l+1;i<=r;i++)mi=min(mi,height[i]);if(mi==0)break;if(mi==N){mi=0;for(int i=sa[l]-1;s[i]>N;i++)mi++;}for(int i=l;i<=r;i++)k+=1ll*mi*c[belong[sa[i]-1]];ans=max(ans,k);}
暴力

   但是這樣是顯然會TLE的,所以需要進一步優化

   考慮每一個height[i]的影響范圍,即在該范圍內,所有包含i的區間都以height[i]為最小值,此時原式的式子就為\(height_i\cdot \sum_{i=l}^{r}c_j\),這里\(l\),\(r\)表示的就是height[i]的影響范圍,\(j\)依然為sa[i]所屬原字符串的編號。預處理每個height[i]的影響范圍以及\(c_j\)的前綴和就好了

#include<bits/stdc++.h>
using namespace std;
#define N 600001
#define LL long long
int wa[N+1001],wb[N+1001],wv[N+1001],Ws[N+1001];
int cmp(int *r,int a,int b,int l){return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(const 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(j=1,p=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++;}return;
}
int sa[N],Rank[N],height[N];
void calheight(const 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++);for(int i=n;i>=1;--i) ++sa[i],Rank[i]=Rank[i-1];
}
char str[N];
LL ans,sum[N];
int n,c[N],s[N],leng[N],belong[N],_l[N],_r[N],len_sum;
void rua(int L,int R)
{LL res=0,x,le;for(int i=L;i<=R;i++){x=belong[sa[i]-1];le=leng[x]-sa[i]+1;if((i==R || height[i+1]<le) && (i==L || height[i]<le))res=max(res,1ll*le*c[x]);}for(int i=L;i<=R;i++)res=max(res,1ll*height[i]*(sum[min(R,_r[i])]-sum[max(L,_l[i]-1)-1]));ans=max(ans,res);
}
int main()
{scanf("%d",&n);scanf("%s",str);int len=strlen(str);for(int i=0;i<len;i++)belong[len_sum]=1,s[len_sum++]=str[i]+N;leng[1]=len_sum;for(int i=2;i<=n;i++){s[len_sum++]=i;scanf("%s",str);len=strlen(str);for(int j=0;j<len;j++)belong[len_sum]=i,s[len_sum++]=str[j]+N;leng[i]=len_sum;}da(s,sa,len_sum+1,N+1000);calheight(s,sa,len_sum);for(int i=1;i<=n;i++)scanf("%d",&c[i]);for(int i=1;i<=len_sum;i++)sum[i]=sum[i-1]+c[belong[sa[i]-1]];_l[1]=1,_r[len_sum]=len_sum;for(int i=2;i<=len_sum;i++){int _=i;while(_>1 && height[i]<=height[_-1])_=_l[_-1];_l[i]=_;}for(int i=len_sum-1;i>=1;i--){int _=i;while(_<len_sum && height[i]<=height[_+1])_=_r[_+1];_r[i]=_;}for(int l=1;l<=len_sum;l++)if(s[sa[l]-1]>N){int r=l;while(r<=len_sum && s[sa[r]-1]>N)r++;rua(l,r-1);l=r;}printf("%I64d\n",ans);
}
View Code

?

轉載于:https://www.cnblogs.com/DeaphetS/p/9665970.html

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

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

相關文章

Redis自增計數

INCR key 將 key 中儲存的數字值增一。 如果 key 不存在&#xff0c;那么 key 的值會先被初始化為 0 &#xff0c;然后再執行 INCR 操作。 如果值包含錯誤的類型&#xff0c;或字符串類型的值不能表示為數字&#xff0c;那么返回一個錯誤。 本操作的值限制在 64 位(bit)有符號數…

android布局中使用include及需注意點

在android布局中&#xff0c;使用include&#xff0c;將另一個xml文件引入&#xff0c;可作為布局的一部分&#xff0c;但在使用include時&#xff0c;需注意以下問題&#xff1a;一、使用include引入如現有標題欄布局block_header.xml&#xff0c;代碼如下&#xff1a;<Rel…

周鴻祎回顧IPO一周年:保持創業心態 看好無線

奇虎360董事長兼CEO周鴻祎 3月19日晚間消息&#xff0c;在奇虎360上市接近一周年之際&#xff0c;奇虎360董事長兼CEO周鴻祎與媒體及個人投資者進行溝通&#xff0c;他表示這一年壓力比以前更大&#xff0c;因為在上市光環下依然需要保持創業心態&#xff0c;同時他強調無線和…

《Effective Java》 第二講:對于所有對象都通用的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 上接《Effective Java》 第一講&#xff1a;創建和銷毀對象 八、覆蓋 equals 時請遵守通用約定 1. 自反性&#xff1a;對于任何非空的引…

linux刪除文件操作

linux刪除文件夾命令 在用Linux的時候&#xff0c;有時候要刪除一個文件夾&#xff0c;往往會提示次此文件非空&#xff0c;沒法刪除&#xff0c;這個時候&#xff0c;必須使用rm -rf命令。 實例一&#xff1a; rm -rf /var/log/httpd/access 將會刪除/var/log/httpd/access目錄…

Python 運算符重載

https://www.cnblogs.com/hotbaby/p/4913363.html轉載于:https://www.cnblogs.com/changbaishan/p/9668720.html

python爬取elasticsearch內容

我們以上篇的elasticsearch添加的內容為例&#xff0c;對其內容進行爬取&#xff0c;并獲得有用信息個過程。 先來看一下elasticsearch中的內容&#xff1a; {"took": 88,"timed_out": false,"_shards": {"total": 5,"successful…

創業必經之路——Paul Graham創業曲線

導讀&#xff1a;國外媒體avc.com近日發表一篇文章《The Startup Curve》&#xff0c;文中談到創業者都處于Paul Graham創業曲線中各個階段&#xff0c;不要一味的畏懼失敗&#xff0c;要多傾聽客戶反饋并從中尋找制勝的信息。總而言之&#xff0c;不畏艱難即可成功。以下為文章…

Java:對象的強、軟、弱和虛引用

見&#xff1a;http://zhangjunhd.blog.51cto.com/113473/53092 maven/Java/web/bootstrap/dataTable/app開發QQ群&#xff1a;566862629。希望更多人一起幫助我學習。 1&#xff0e;對象的強、軟、弱和虛引用在JDK 1.2以前的版本中&#xff0c;若一個對象不被任何變量引用&am…

java注解:@Deprecated(不建議使用的,廢棄的);@SuppressWarnings(忽略警告,達到抑制編譯器產生警告的目的)

java注解&#xff1a;Deprecated(不建議使用的&#xff0c;廢棄的), SuppressWarnings(忽略警告&#xff0c;達到抑制編譯器產生警告的目的)Deprecated可以修飾類、方法、變量&#xff0c;在java源碼中被Deprecated修飾的類、方法、變量等表示不建議使用的&#xff0c;可能會出…

Mysql 替換字段的一部分內容

UPDATE 表名 SET 字段名 REPLACE( 替換前的字段值, 替換前關鍵字, 替換后關鍵字 ) WHERE 字段名 REGEXP "替換前的字段值"; 例子&#xff1a; UPDATE user SET mobile REPLACE( head_img, "http://7xswdm.com1.z0.glb.clouddn.com", "http://qiniu-i…

聊聊3種最常見的響應式設計問題

響應式設計方法對開發者非常有用&#xff0c;因為它使我們的內容在各種設備上廣為傳播。不用保留幾個獨立版本的網站&#xff0c;也可以摒除諸如縮放和流式布局這些方法的弊端。 縮放、流式布局與響應式 這些術語容易造成混淆&#xff0c;設計師常常錯誤地交替互用。實際上&…

PV、TPS、QPS是什么

pv 是指頁面被瀏覽的次數&#xff0c;比如你打開一網頁&#xff0c;那么這個網站的pv就算加了一次&#xff1b;tps是每秒內的事務數&#xff0c;比如執行了dml操作&#xff0c;那么相應的tps會增加&#xff1b;qps是指每秒內查詢次數&#xff0c;比如執行了select操作&#xff…

AOP原理解析及Castle、Autofac、Unity框架使用

轉自&#xff1a;https://www.cnblogs.com/neverc/p/5241466.html AOP介紹 面向切面編程&#xff08;Aspect Oriented Programming,英文縮寫為AOP&#xff09;&#xff0c;通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。 AOP是OOP的延續&#xff0c;是軟件…

bootstrap validator 提供了哪些驗證函數

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 目前提供的校驗方法有&#xff1a; "notEmpty" : "不能為空", "password" : "請輸入正確的密碼&q…

帕累托分布(Pareto distributions)、馬太效應

什么是帕累托分布 帕累托分布是以意大利經濟學家維弗雷多帕雷托命名的。 是從大量真實世界的現象中發現的冪次定律分布。這個分布在經濟學以外&#xff0c;也被稱為布拉德福分布。 帕累托因對意大利20%的人口擁有80%的財產的觀察而著名&#xff0c;后來被約瑟夫朱蘭和其他人概括…

兩個class寫在同一個java文件中

第一種&#xff1a; 一個public類&#xff0c;多個非public類&#xff0c;例如&#xff1a;public class A&#xff5b;&#xff5d;class B&#xff5b;&#xff5d;第二個class前面不能加public。 第二種&#xff1a; 第二種是內部類&#xff0c;寫在公共類體里面的&#xff…

微信小程序的一些數據調用方式

1.模板數據的調用 一張圖了解一下在wxml頁調用預先定義好的模板&#xff1a; 可以看到上面調用了兩個模板&#xff0c;數據調用卻是不同的&#xff0c;obj是一個對象&#xff0c;對象內包含多個鍵值對形式的數據&#xff1b; tabbar是一個一維數組&#xff0c;每個數組項又都是…

手機廠商探路互聯網:硬件高利潤時代已成歷史

華為消費者業務集團CEO兼終端公司董事長余承東近日出席“2012年全球移動互聯網大會”期間證實&#xff0c;華為計劃與奇虎360合作推出一款智能手機。 余承東表示&#xff0c;華為終端將嘗試與多家互聯網公司就智能手機業務展開合作&#xff0c;但他未透露與奇虎360合作的更多細…

解決:按截圖 ctrl+alt+a QQ聊天窗口就自動最小化(QQ以外的可以截圖)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、問題如題 &#xff0c;想截圖QQ聊天記錄都不行 二、 解決方法&#xff1a; 如圖找到QQ截圖按鈕&#xff0c;點擊下拉倒三角&…