noip測試 拯救紫萱學姐(kmp 樹形dp)

2021-07-24 10:09:32 字數 1696 閱讀 2590

時間限制:1 s 記憶體限制:256 mb

其實在開考前半個小時題面並不是這樣的。

由於明天要考試,同學們要把抽屜裡的書都搬空,書很多而且辦了走讀不能回寢室的學長一眼就看到了回班撩他的學姐,於是就把學姐當學長用♂了:「幫我把這摞書搬走ovo」。

學姐筋疲力盡地抱著沉重的一摞書回到了機房,出於無聊她翻開了學長的字典。

學長的字典由乙個字串組成。對於兩個字串a和b,如果a既是b的字首也是b的字尾,那麼稱a和b「相似」,空字串和任何字串相似。乙個字串可以通過編輯變換成乙個比它短而且與它相似的字串,付出的代價為這兩個字串的長度之差的平方。兩個字串通過編輯而變為同乙個字串所花費的最小代價被稱為最短編輯距離。

給定學長的字典,現在學姐想知道這個字串的每一對字首的最短編輯距離中的最大值是多少。請你幫助勞累的紫萱學姐解決這個問題。

【輸入格式】

乙個字串,僅包含小寫英文本母。

【輸出格式】

這個字串每一對字首中最長的最短編輯距離。

【樣例輸入】

abcab

【樣例輸出】

23 【提示】

最短編輯距離最長的一對字首是abca和abcab,最短變換過程如下(箭頭中的數字為過程的代價)

「abca」-9->「a」-1->(空字串)

「abcab」-9->「ab」-4->「」

對於40%的資料,n≤500。

對於70%的資料,n≤5000。

對於100%的資料,n≤1000000,n為字串長度。

比較好的一道思路題。

首先考慮暴力怎麼做。由於是計算平方值,對於兩個固定的串,肯定是把每一步分得越小越好。也就是說,每乙個串都和它的失配有關。

考慮以i結尾和以j結尾的字首,每次都暴力地將這兩個點蹦到離當前點比較近的失配,然後從那個失配的答案轉移。實際上是乙個暴力dp,時間複雜度o(

n2∗2

logn

) 。

考慮怎麼將這個演算法優化。可以發現,每乙個點有可能向其後面的點轉移,但是它只會由它的失配轉移過來。這樣實際上就是構成了乙個樹結構,樹的邊權就是點數的平方。這樣的話,由於是求兩個不同的字首的答案,其實就是求樹上不同的兩個點距離的最大值,即為樹的直徑。時間複雜度o(

n2) 。

考試的時候有一些奇怪的思路,比如連邊之後跑最長路。但是最長路是多源的發現並不能搞定。其實這個樹的模型還是比較顯然的。

#include

#include

#include

using

namespace

std;

#define n 1000005

#define ll long long

int n;

char s[n];

int t[n];

int tot,point[n],nxt[n*2],v[n*2];ll c[n*2];

ll f[n],g[n],ans;

void calc()

}void add(int x,int y,ll z)

void treedp(int x,int fa)

else g[x]=max(g[x],f[v[i]]+c[i]);

}ans=max(ans,f[x]+g[x]);

}int main()

①分析能力和建模能力還是有點弱啊。以後一定要多抽象,多聯絡。

NOIP模擬測試22

自 閉 賽 從這次比賽之後題都好難啊qaq 開考一小時內沒動鍵盤。三道題都不會。gg problem a 數論 過於玄學 列舉質因子,往答案裡去加。用來加入的質因子不會很多,質因子大了對答案是不優的。開兩個vector來回倒騰就完了 這題改完感覺也沒啥,為啥考場上就是想不出來啊qxq 1 inclu...

NOIP模擬測試20

liu runda聚聚的饋贈 problem a 周 防自閉題?這道題讓我整個考試都很愉悅 搜就完事了 1 include 2 3intn 4 int a 20 b 20 c 20 d 20 5 long long ans 67 void dfs int day,long long oi,long ...

NOIP模擬測試15

t2讀題跪掉了好可惜 qaq problem a 建設城市 插板加容斥搞個不停,得到柿子 sum limits 1 c times c n i 預處理階乘和階乘逆元,ning幹。1 include 2 define ll long long34 const int d 998244353 5 ll ...