九峰與子串行 字串雜湊 dp

2021-10-19 16:14:07 字數 1092 閱讀 2133

n個字串

n<=40, 1<=|s|<=5e6

每個字串取或者不取,這個dp有01揹包的思想。

dp[i][j]表示前i個字串能夠拼接成s的前j個字元的個數,與01揹包不同的就是用到了字串雜湊判斷是否相等。tmp是字串

如果tmp等於主串s的子串get(j - len + 1, j)的雜湊值,說明

否則繼承dp[i][j]=dp[i-1][j]。注意01揹包格式,j要逆序。

利用滾動陣列,二維轉一維:dp[j]+=(tmp==get(j-len+1,j)) * dp[j - len]。

#includeusing namespace std;

#define io cin.tie(0);ios::sync_with_stdio(false);

#define debug(x) cout<

#define ll long long

#define ull unsigned long long

#define lb long double

#define rs p<<1|1

#define ls p<<1

#define eps 1e-12

const int maxn = 5e6 + 5;

const int mod = 1e9 + 7;

const ll inf = 1e18;

const int bas = 2333;

inline ll read()

while(c>='0'&&c<='9')

return f*p;

}ull has[maxn], p[maxn];

char s[maxn], a[maxn];

int dp[maxn];

ull get(int l, int r)

void solve()

dp[0] = 1;

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

for(int j = m; j >= len; j --)

}cout << dp[m] << endl;

}int main()

DP總結 字串 子串

題目描述 有兩個僅包含小寫英文本母的字串a和b。現在要從字串a中取出k個互不重疊的非空子串,然後把這k個子串按照其在字串a中出現的順序依次連線起來得到乙個新的字串,請問有多少種方案可以使得這個新串與字串b相等?注意 子串取出的位置不同也認為是不同的方案。由於答案可能很大,所以這裡要求輸出答案對1,0...

判斷字串子串行

判斷字串子串行 給定字串 target和 source,判斷 target 是否為 source 的子串行。你可以認為 target 和 source 中僅包含英文小寫字母。字串 source可能會很長 長度 500,000 而 target 是個短字串 長度 100 字串的乙個子串行是原始字串刪除...

字串與序列

一.字串 1.字串的內建方法 capitalize 把字串的第乙個字元改為大寫 casefold 把整個字串所有的字元改為小寫 center width 將字元居中,並使用空格填充至長度width的新字串 count sub start end 返回sub字元在字串裡出現的次數,start和end引...