牛客 練習賽17B 好位置 DP

2021-08-19 19:25:37 字數 781 閱讀 8714

題意:給出兩個串s,x.定義i為好位置.當存在包含位置i的子串行和x相同.

|s|,|x|<=2e5 問s的位置是否全部為好位置.

判斷i是否為好位置,那麼可以分為字首i,字尾i+1.

s的字首i在x匹配到的位置顯然越後越優.

設pre[i]為字首i最多能匹配多少個.f[i]為以位置i結尾的子串行最多匹配多少個.

f[i]<=pre[i], f[i] = x[1:pre[i]]中最後乙個出現字元s[i]的位置.

那麼s[i+1:n]是否有x[f[i]+1:m]這乙個子串行. 

翻轉s,x和上面一樣處理即可.

#include using namespace std;

const int n=2e5+5;

char s[n],x[n];

int p[n],f[n],suf[n],h[n],n,m;

vectorv[30];

int main()

else

}reverse(s+1,s+1+n);

reverse(x+1,x+1+m);

for(int i=0;i<30;i++)

v[i].clear();

for(int i=1;x[i];i++)

v[x[i]-'a'].push_back(i);

for(int i=1;s[i];i++)

bool flag=true;

for(int i=1;i<=n;i++)

{ int ned=m-f[i];

if(suf[n-i]

牛客練習賽4 B

思維題,把 i2 j2 ai2 aj2 絕對值符號去掉後,我們設i2 j2 ai2 aj2 j2 i2 aj2 ai2 j2 aj2 i2 ai2 或者 i2 j2 ai2 aj2 j2 i2 aj2 ai2 ai2 i2 aj2 j2 原式化簡後只有這兩種形式,那麼我們可以設定兩個陣列a n b ...

牛客練習賽69 B

題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...

《牛客練習賽28 B》

這題主要就是多了乙個平方和的操作。我們維護平方和的值的時候。需要注意在下放的時候,要先把乘法之後的sum1算出來,這對算sum1最終的值沒有影響。但是對sum2的值有影響。因為我們在計算中就在更新adtag的值,所以這個adtag它的sum1應該最終化。includeusing namespace ...