題意:給出字串t,問有多少個長度為m的字串s滿足,t是s的子串行.
|t|,m<=1e5.
設d[i]:[1...i]時,字串t第一次作為子串行出現
d[i]= (c(i-1,t-1)*pw[i-t]) - (d[i-1]+d[i-2]+..d[1]). 前半部分明顯計算重複!!!(然後就卡在這裡了..).
換種思考方式,m個位置 假如當前匹配了i位 那麼匹配到下一位之前 每個位置都是只有25種選法.最後匹配到第x位結束.後面位任意
還是列舉第一次匹配成功的位置i,前面i-1個位置選t-1個作為匹配位.剩下的每個位置都有25種選法.
#include using namespace std;
typedef long long ll;
const int n=2e5+5,mod=1e9+7;
ll pw[n],d[n],f[n],t,m,pw25[n];
void init()
return s;
}ll c(ll n,ll m)
{ if(n
D 最長上公升子串行
乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些...
問題 D 刪除回文子串行
這是營長的一題簽到題 免費送給大家 給你乙個字串 s,它僅由字母 a 和 b 組成。每一次刪除操作都可以從 s 中刪除乙個回文子串行。輸出刪除給定字串中所有字元 直到字串為空 的最小刪除次數。子串行 定義 如果乙個字串可以通過刪除原字串某些字元而不改變原字元順序得到,那麼這個字串就是原字串的乙個子串...
OpenJudge P1808 公共子串行 DP
總時間限制 1000ms 記憶體限制 65536kb 描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在 嚴格上公升 的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x...