題意:給出兩個串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 ...