首先,我們可以把題目轉變成這樣:對於一些a類串,其有連向某些b類串的邊;對於某些b類串,其又有連向某些a類串的邊。要你找出一條權值最長的路徑。(此時顯然如果成環則答案一定是 \(-1\))
a到b的串題目已經給出了,關鍵是b到a的串。
我們發現,若某個 \(b\) 是 \(a\) 的字首,則 \(a\) 由 \(b\) 在後面新增字元得到,需要在自動姬上搞,我們又不知道什麼可以維護自動姬的結構;但是,如果我們把它轉成字尾的話,就會發現這時我們變成了在parent tree上搞。處理一棵樹可比處理dag好多了,我們果斷嘗試這種思路。具體而言,我們翻轉整個串,這樣要求便變為了 \(b\) 是 \(a\) 的字尾,即 \(b\) 所對應的節點在parent tree上是 \(a\) 的父親。(當然,實際上我們會發現二者對應的節點可能相同,這時便要判斷是否有 \(|a|\geq|b|\),若成立則 \(b\) 可以到 \(a\);為了統一兩組情形,我們在相同節點處就把該節點按照長度不同拆開,這樣就還是 \(a\) 節點的所有父親上的 \(b\) 都連到 \(a\))
這樣處理完後,我們發現連到 \(a\) 的所有 \(b\) 在 parent tree 上成一條到根的路徑。
考慮將圖中所有邊反向,這時就變成了從最後乙個 \(a\) 串到第乙個 \(a\) 串的路徑。然後,考慮將 parent tree 拷貝乙份,一棵代表所有的 \(a\) 串,一棵代表所有的 \(b\) 串。現在,假設這兩棵樹上初始都沒有邊,考慮怎樣連邊讓它符合我們的要求。
首先,從最後乙個 \(a\) 串出發,要能走到所有路徑上的 \(b\) 串;因此,對於 \(a\) 樹中每個節點,連到其在 \(b\) 樹中對應的節點,並且在 \(b\) 樹中讓所有的兒子連到父親,這樣便實現了此過程。然後,\(b\) 還要能回到 \(a\),於是對於一組「支配關係」,直接讓它從 \(b\) 上對應節點連到 \(a\) 上對應節點即可。這樣搞完後,我們便得到了最終需要的圖。
52行極短**,你值得擁有
#includeusing namespace std;
typedef long long ll;
int t,n,m,a,b,cnt=1,id[200100],aa[200100],bb[200100],tot,val[1600100],in[1600100];
ll f[1600100],res;
char s[200100];
struct suffix_automatont[400100];
int add(int x,int c)
int y=t[x].ch[c];
if(t[y].len==t[x].len+1)
int yy=++cnt;t[yy]=t[y],t[yy].len=t[x].len+1;
t[xx].fa=t[y].fa=yy;
for(;x&&t[x].ch[c]==y;x=t[x].fa)t[x].ch[c]=yy;
return xx;
}int anc[400100][20];
mapmp[400100];
int substring(int l,int r)
vectorv[1600100];
void ae(int x,int y)
queueq;
int main()
scanf("%d",&m);for(int i=1,x,y;i<=m;i++)scanf("%d%d",&x,&y),ae(bb[y]+tot,aa[x]);
for(int i=1;i<=tot;i++)ae(i,tot+i);for(int i=1;i<=2*tot;i++)if(!in[i])q.push(i);
while(!q.empty())}
for(int i=1;i<=2*tot;i++)if(in[i])else res=max(res,f[i]);printf("%lld\n",res),res=0;
for(int i=1;i<=cnt;i++)memset(t[i].ch,0,sizeof(t[i].ch)),t[i].len=t[i].fa=0,mp[i].clear();cnt=1;
for(int i=1;i<=2*tot;i++)v[i].clear(),val[i]=in[i]=f[i]=0;tot=0;
} return 0;
}
十二省聯考 2019 字串問題
以前寫完題後鴿了部落格,現在補一下。今天下午機房的人在大螢幕上一直掛著 ioi 的榜,關注亞塞拜然那邊的比賽情況,我本來是衷心祝願中國隊能有人阿克 day1 的 zzq?然而六點後回來發現只有班傑明阿克了 實際上他還是三小時就阿克了 中國隊最高的是 zzq 和俄羅斯的 300iq 好像是並列第三?可...
十二省聯考2019 字串問題
現有乙個字串 s tiffany 將從中劃出 n a 個子串作為 a 類串,第 i 個 1 leqslant i leqslant n a 為 a i s la i,ra i 類似地,yazid 將劃出 n b 個子串作為 b 類串,第 i 個 1 leqslant i leqslant n b 為...
十二省聯考 2019 字串問題 字尾陣列
十二省聯考 2019 字串問題 題意 給定乙個字串 s 並選取 n a 個子串作為 a 類串,選取 n b 個子串作為 b 類串,還給了 m 個支配關係 第 x 個 a 類串支配第 y 個 b 類串。請你求出最長串 t 的長度,t 滿足 t a a a 且 forall i in 1,k 1 a 支...