題目鏈結
先用kmp求出t能出現在s的哪些位置。
我們維護這樣的三個dp方程:
dp1[i]表示 最後乙個區間結尾r在i的方案數。
dp2[i]表示 最後乙個區間結尾r在[0…i]的方案數。
dp3[i]表示 最後乙個區間開頭l在[0…i]的方案數。
轉移即可,dp2[n]即為答案。
複雜度o(n
)o(n)
o(n)
。
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n =
1e5+
100;
const
int mod =
1e9+7;
int n, m;
int nex[n]
;char s1[n]
, s2[n]
;void
getnex
(char
*str,
int n)
else
j = nex[j];}
}vector<
int> v;
int dp1[n]
, dp2[n]
, dp3[n];/*
dp1[i] 表示r以i結尾的區間個數
dp2[i] 表示r以0...i結尾的區間個數
dp3[i] 表示l在0...i的區間個數
*/void
upd(
int&a,
int b)
intmain()
else
j = nex[j];}
if(v.
size()
==0) dp1[0]
= dp2[0]
=1;int ans =0;
for(
int i =
1, j =
0; i <= n; i++
) dp2[i]
=(dp2[i -1]
+ dp1[i]
)% mod;
}printf
("%d\n"
, dp2[n]-1
);return0;
}
51nod 1088 最長回文子串
回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸出最長回文子串的長度l。input示例 daabaacoutput示例 5 解法一 暴力列舉所有串 若當前列舉串...
51 nod 1088 最長回文子串
1088 最長回文子串 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏 關注 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸...
51Nod 1088 最長回文子串
1088 最長回文子串 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸出最長回文子...