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引...