20200722NOIP提高組模擬T4 詞韻

2022-08-18 23:18:19 字數 1610 閱讀 3577

p4471 [bjwc2018]詞韻

懶得打了,自己看題吧.

由於本題求的是最長公共字尾,所以我們可以想到從末尾倒序構造trie,然後再來分析此題.可以注意到的是,兩個詞能夠押韻,當且僅當它們的關鍵點在trie上是父子或兄弟關係.所以我們可以考慮樹形dp.由於兄弟節點較難維護,所以我們可以在父節點中更新,所以我們只看其子節點.對於乙個點$x$,f[x]維護該點的dp值,g[x]維護該點的子節點的子樹中最大的連續關鍵點鏈值.單詞$x$可以從前插入若干個單詞,也可以從後插入若干個單詞,構成乙個押韻的序列,所以根據貪心策略,我們選擇g[x]的最大值_和次大值__(沒錯,它們都是變數名),然後統計dp答案即可.

#include#include

#include

#include

#include

#include

#include

#define r register

#define next exntttttttttttttttt

#define debug puts("mlg")

using

namespace

std;

typedef

intll;

typedef

long

double

ld;typedef unsigned

long

long

ull;

inline ll read();

inline

void

write(ll x);

inline

void

writesp(ll x);

inline

void

writeln(ll x);

struct

nodetrie[

1000000

];char

wn;ll c[

1000000

],h;

ll n,tot;

inline

void

insert()

++trie[now].cnt;

}ll ans,f[

1000000],g[1000000

];inline

void

dfs(ll x)

else

if(g[trie[x].son[i]]>__) __=g[trie[x].son[i]];}}

if(trie[x].cnt) g[x]=f[x]+_;

ans=max(ans,_+__+f[x]+trie[x].cnt);

}int

main()

dfs(0);

writeln(ans);

}inline ll read()while(ch>='

0'&&ch<='

9')return x*t;}

inline

void write(ll x)if(x<=9)write(x/10);putchar(x%10+'0'

);}inline

void writesp(ll x)

inline

void writeln(ll x)

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...

NOIP提高組2005 過河

過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...

NOIP提高組 20151029模擬

其實這套題目並不算太難,但是還是發揮不了100 水平。第一題直接線性篩法,求出質數,然後就可以判斷乙個數是否為質數了。這道題還可以用miller rabin去求,後者的速度較快,如果資料再大些,就要使用後者了。第二題,比賽時發現了,當n 7時,答案會每四個一迴圈,但是就沒有繼續往下想,其實想下去會想...