[Codeforces700E Cool Slogans]

簡要題意

給出一個長度為n的字符串s[1],由小寫字母組成。定義一個字符串序列s[1....k],滿足性質:s[i]在s[i-1] (i>=2)中出現至少兩次(位置可重疊),問最大的k是多少,使得從s[1]開始到s[k]都滿足這樣一個性質。

\(n\le 200000\)

Sol

一道適合練習SAM的right集合神題 + 神仙結論題

結論(1)

每次只算\(s[i-1]\)\(s[i]\)的后綴的情況,顯然是不會影響答案的。

因為如果\(s[i-1]\)不是\(s[i]\)的后綴,那么我們把不與\(s[i-1]\)匹配的那后面一截都去掉,\(s[i]\)就會變短。

如果沒變短之前它在某一個字符串里出現過了,那么變短后顯然還是出現過的。

這個結論是顯然的,也比結論(2)容易理解。

建立后綴自動機。
容易想到直接在parent樹上自上向下DP;

考慮如何判斷x的祖先y所代表的子串是否在x中出現了兩次:
\(len[x]\)表示\(x\)代表的最長子串長度,假設\(x\)\(right\)集合中存在一個位置\(p\)
那么\(p\)顯然已經在\(y\)\(right\)集合中了,
我們只要判斷\(y\)\(right\)集合中有沒有一個元素,
在區間\([pos(x)-len(x)+len(y),pos(x)-1]\)中判斷y串是否出現兩次即可。

這個容易線段樹合并完成。

可以發現,我們以上的做法都只考慮父親代表的最長串都必須出現在x代表的最長串中。

這樣有沒有問題呢?又如何dp呢?

結論(2)

設s是某個節點u表示的最長串,v是u的祖先(即串的后綴),
則v表示的所有字符串在s上的匹配情況是等價的(即不會出現有的能匹配、有的不能)。

證明的話,我們舉個例子:

\((1)\ \ \ \ \ \ abcb\)

\((2)\ \ \ \ babcb\)

\((s)\ \ \ \ \ \ abcbabcb\)

考慮反證:

假設這里(s)的后綴(1)(2)均為v節點表示的串,(1)成功匹配而(2)不行。

因為(2),所有顯然還存在著這個串:

\((3)\ \ \ \ babcbabcb\)

又因為(s)表示的已經是u的最長串了,所以(3)串一定來自另一個節點。

設(3)串來自另一個節點w,u是w的祖先。

根據定義知
\[ |Right(u)| > |Right(w)| \]

這樣,則一定存在一個位置p
\[p ∈Right(u) - Right(w)\]
在這個位置只出現了(s)串而沒有(3)串。

這樣就存在一個位置使得只出現(1)串而沒有(2)串。

這樣得到(1)(2)兩串\(Right\)集合不同??

這與它們來自同一個節點矛盾!

證畢.

有了結論(2),我們就可以設計dp狀態了:

\(dp[i]\)表示使用節點i最長的那個字符串的答案,
轉移的時候可以直接使用祖先節點j最長的那個字符串轉移(因為都等價啊)

這樣一來整個dp過程都是忽略那部分短串的,就非常自然了。

這個dp顯然可以倍增,容易做到線性(對深度Two-pointer)。

#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;const int N=400005;char S[N];
int n,tot(1),la,ch[N][26],len[N],fa[N],pos[N],rt[N],cnt,rk[N],ar[N],dp[N],fr[N],Ans;struct node {int lc,rc;
}t[N*20];void Upd(int &u,int l,int r,int p)
{if(!u)u=++cnt;if(l!=r){int m=(l+r)>>1;if(m>=p) Upd(t[u].lc,l,m,p);else Upd(t[u].rc,m+1,r,p);}
}int Merge(int x,int y,int l,int r)
{if(!x||!y)return x+y;int o=++cnt;if(l!=r){int m=(l+r)>>1;t[o].lc=Merge(t[x].lc,t[y].lc,l,m);t[o].rc=Merge(t[x].rc,t[y].rc,m+1,r);}return o;
}int Query(int u,int l,int r,int L,int R)
{if(!u||l>R||r<L)return 0;if(l>=L&&r<=R)return 1;int m=(l+r)>>1;return Query(t[u].lc,l,m,L,R)||Query(t[u].rc,m+1,r,L,R);
}void extend(int id,int where)
{int p=la;int np=++tot;len[np]=len[p]+1;pos[np]=where;while(p && !ch[p][id]){ch[p][id]=np;p=fa[p];}if(!p){fa[np]=1;}else{int q=ch[p][id];if(len[p]+1==len[q]){fa[np]=q;}else{int nq=++tot;len[nq]=len[p]+1;fa[nq]=fa[q];pos[nq]=pos[q];for(int i=0; i<26; i++)ch[nq][i]=ch[q][i];fa[np]=fa[q]=nq;while(p && ch[p][id]==q){ch[p][id]=nq;p=fa[p];}}}la=np;Upd(rt[la],1,n,where);
}void Sort()
{for(int i=1; i<=tot; i++) ar[len[i]]++;for(int i=1; i<=n; i++) ar[i]+=ar[i-1];for(int i=1; i<=tot; i++) rk[ar[len[i]]--]=i;
}int main()
{scanf("%d%s",&n,S+1);la=1;for(int i=1; i<=n; i++) extend(S[i]-'a',i);Sort();for(int i=tot; i!=1; i--){int u=rk[i],v=fa[u];rt[v]=Merge(rt[v],rt[u],1,n);}for(int i=2; i<=tot; i++){int u=rk[i],v=fa[u];if(v==1){dp[u]=1;fr[u]=u;}else if(Query(rt[fr[v]],1,n,pos[u]-len[u]+len[fr[v]],pos[u]-1)){dp[u]=dp[v]+1;fr[u]=u;}else{dp[u]=dp[v];fr[u]=fr[v];}Ans=max(Ans,dp[u]);}printf("%d",Ans);return 0;
}

轉載于:https://www.cnblogs.com/bestwyj/p/10847198.html

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

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

相關文章

Google的“機器人情結”:兩次合計36億美元的人工智能收購

據Re/code1月27日消息&#xff0c;Google將收購&#xff08;據知情人透露約4億美元&#xff0c;未經證實&#xff09;一家人工智能公司DeepMind。DeepMind公司位于英國倫敦&#xff0c;由神經系統科學家DemisHassabis、網絡語音通訊軟件Skype開發者JaanTallin和研究人員ShaneLe…

Mac OS使用技巧之八:Dock欄使用技巧

本篇博客&#xff0c;我們來講一下Mac OS的標志性的東西————Dock。在我們的第七篇系列博客里面已經提及了神秘強大的Dock欄。這是蘋果的一大亮點。Dock中間偏右側有一條淺淺的分割線。分割線左側是APP的圖標&#xff0c;在運行的下面會有白色光點。分割線右側是堆棧&#x…

man:命令幫助使用手冊

man&#xff1a;在linux中作為手冊存在&#xff0c;含義就是命令的使用手冊 在man命令的幫助使用手冊中&#xff0c;其中的常用按鍵及其用途如下所示 按鍵 用處 空格鍵 向下翻一頁 PaGe down …

報錯,但不影響運行ERROR: JDWP Unable to get JNI 1.2 environment, jvm-GetEnv() return code = -2...

eclipse 3.4jdk1.6 編譯正常通過&#xff0c;運行debug模式時報錯 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820] 查找該錯誤原因。發現是重定向輸出…

Mac OS使用技巧之九:Mission Control和DIY自己的Dashboard

一、Mission Control使用技巧Mac OS X為我們提供了更加無縫和流暢的多桌面、應用管理和切換&#xff0c;Mission Control。之前的教程里面也提到過。觸摸板四指向上平移&#xff08;可以在系統偏好里面設成三指&#xff09;&#xff0c;就可以調出高端大氣的Mission Control。包…

【NOIP必備攻略】 基本noilinux使用方法

現在linux系統已經成為了NOIP競賽的一大操作系統&#xff0c;如果連最基礎的操作都不會&#xff0c;那就更別提怎么得分了&#xff0c;萬一操作失誤&#xff0c;可就爆零了。所以小編特意發這樣一篇博客&#xff0c;教你快速上手noilinux&#xff01; ▎ 常用操作 1&#xff09…

1067: 有問題的里程表

[提交][狀態][討論版][命題人:admin]題目描述 某輛汽車有一個里程表&#xff0c;該里程表可以顯示一個整數&#xff0c;為該車走過的公里數。然而這個里程表有個毛病&#xff1a;它總是從3變到5&#xff0c;而跳過數字4&#xff0c;里程表所有位&#xff08;個位、 十位、百位等…

Mac OS使用技巧之十:Finder的詳細使用方法

Finder就是Mac OSX中資源管理器&#xff0c;我們用它來管理我們所有的文件。先來說一下Finder的打開方法吧&#xff0c;&#xff08;1&#xff09;單擊Dock上的Finder圖標。&#xff08;2&#xff09;快捷鍵為【command】向上方向鍵或者【command】【N】下面我們來看一下10.9 M…

css中圖片有縮放和轉動效果

現在html中利用div來包裹住一張圖片。 <div class"xuanzhuan"><img src"images/top.png" alt""></div> 然后在css中利用固定定位來將圖片固定好&#xff0c;再利用動畫的效果即可出來。 .xuanzhuan {position: fixed;top: 20%…

7.6 yum更換國內源 7.7 yum下載rpm包 7.8/7.9 源碼包安裝

2019獨角獸企業重金招聘Python工程師標準>>> 7.6.yum更換國內源 自定義yum源&#xff1a; [rootbogon ~]# cd /etc/yum.repos.d [rootbogon yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo CentOS-CR.repo …

Mac OS使用技巧之十一:隱藏launchpad中圖標的方法

開講前注釋&#xff1a;一個逗比公司&#xff1d;adobe公司&#xff0c;成立于1982年&#xff0c;總部位于加利福尼亞。Launchpad是Mac系統的一大特色&#xff0c;借鑒了IOS系統的APP存放方式&#xff0c;圖形化的瀏覽應用程序&#xff0c;而非是在文件中死板的瀏覽&#xff0c…

MySQL數據庫入門到高薪培訓教程(從MySQL 5.7 到 MySQL 8.0)

一、MySQL數據庫入門到高薪培訓視頻教程&#xff08;從MySQL5.7到MySQL8.0&#xff09; 本套MySQL學習教程地址&#xff1a; https://edu.51cto.com/course/18034.html 為滿足想快速入門學習MySQL的學員&#xff0c;風哥設計一套比較全面的MySQL新手快速入門學習視頻課程。 本…

雙因素認證方案

一、 網絡安全認證的需求背景 網絡釣魚、欺詐等網絡犯罪現象已經達到非常嚴峻的情況&#xff0c;用戶如果只依賴個人密碼進行帳戶登錄或網上交易&#xff0c;是非常危險和不可靠的認證方法。針對這些問題&#xff0c;北京中科恒倫科技有限公司推出基于動態令牌的雙因素身份認證…

Mac OS使用技巧之十二:解決APP Store更新、下載出錯的問題

前面介紹了Mac OSX那么多強大的功能和各式各樣的使用技巧&#xff0c;那么蘋果系統有沒有讓人頭疼的地方呢&#xff1f;恐怕APP Store的下載問題一直是困擾許多用戶的永恒問題&#xff0c;為什么有的時候就可以下&#xff0c;為什么有的時候就不可以下&#xff1f;可能是因為網…

解決:設置中打開藍牙,測試機不會自己主動搜索設備

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主同意不得轉載。https://blog.csdn.net/huangyabin001/article/details/36027575 【操作步驟】&#xff1a;設置中打開藍牙&#xff0c;測試機不會自己主動搜索設備【測試結果】&#xff1a;設置中打開藍牙&#xff…

Xshell替代品 -- FinalShell

對于運維人員來說&#xff0c; 使用的最常用的遠程終端連接工具無非就是crt或者Xshell, 而crt則需要破解才能使用&#xff0c; Xshell雖說可以免費使用&#xff0c; 但經常在啟動的時候會要求你購買&#xff0c; 然后一直卡住不讓你啟動&#xff0c; 既耽誤了工作時間又需要浪費…

Mac OS使用技巧之十三:Finder中標記的使用

我們直入主題&#xff0c;在Mac系統中&#xff0c;我們可以為文件添加不同顏色、不同數量的標記來強調其重要性或者表示其種類 &#xff08;現在說的標記&#xff0c;就是以前版本里面的標簽&#xff0c;覺得沒有以前版本的標記明顯&#xff0c;好看&#xff09;如下圖&#x…

Spring mvc 上下文初始化過程

為什么80%的碼農都做不了架構師&#xff1f;>>> 在軟件開發的中&#xff0c;如果某些特性的使用比較普遍&#xff0c;那么這些特性往往可以作為平臺特性來實現&#xff0c;通過對這些平臺特性進行有效的封裝&#xff0c;使其向其他應用開放。正是如此&#xff0c;S…

經典七大排序算法

經典排序算法在面試中占有很大的比重&#xff0c;也是基礎&#xff0c;為了未雨綢繆&#xff0c;在寒假里整理并用Python實現了七大經典排序算法&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;選擇排序&#xff0c;希爾排序&#xff0c;歸并排序&#xff0c;快速排…

誰能給我講講原理——視頻彈幕游戲!!

舍友在一個叫BliBli的視頻網站上找到這樣一個視頻彈幕游戲&#xff0c;說實話我當時一看真的驚呆了。 從來沒有見過這種能夠互動的、充滿游戲性的視頻&#xff0c;用戶WASD可以控制飛機移動躲避字幕&#xff0c;撞到字幕左上角死亡次數還可以計數&#xff0c;字幕還并不是單一…