51nod 1202 子串行的個數 dp

2021-09-30 13:56:15 字數 1301 閱讀 2066

1202 子串行個數

福州大學 oj

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

子串行的定義:對於乙個序列a=a[1],a[2],......a[n]。則非空序列a'=a[p1],a[p2]......a[pm]為a的乙個子串行,其中1<=p1例如4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。對於給出序列a,有些子串行可能是相同的,這裡只算做1個,請輸出a的不同子串行的數量。由於答案比較大,輸出mod 10^9 + 7的結果即可。

input

第1行:乙個數n,表示序列的長度(1 <= n <= 100000)

第2 - n + 1行:序列中的元素(1 <= a[i] <= 100000)

output

輸出a的不同子串行的數量mod 10^9 + 7。
input示例

412

32

output示例

13
如果算上重複的話dp[i]=dp[i-1]*2,要求是不能重複,如何去掉重複的那一部分呢,或者重複了多少呢,重複了dp[mark [ a[i]-1 ] ]個,其中mark[i]標記了前面串中字元i出現的最靠近的位置

可以舉個例子方便理解

原串:「kaba」  ,k表示一段任意長的字串,且第乙個字元'a'的下標為index,故dp[index-1]為字串k的不重複子序列的個數,這裡用k表示這些子串行

則原串的所有子串行:"kaba"  "kab_"   "ka_a"   "ka__"  

"k_ba"  "k_b_"   "k__a"   "k___"

其中_表示空,重複的有"ka__" 和"k__a"(都是「ka」),總共有dp[index-1]個,(「k」為k的所有不重複子序列)

這個轉移方程的應該為

dp[index]=dp[index-1]*2;

dp[index+1]=dp[index]*2;

dp[index+2]=dp[index+1]*2-dp[mark[『a']-1],其中mark[』a']為index(假設字串下標從1開始)

#includeusing namespace std;

long long a[100005],book[100005],dp[100005];

const long long mo=1e9+7;

int main()

dp[0]=1;

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

cout<

51nod 1202 子串行個數

子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1例如4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。對於給出序列a,有些子串行可能是相同的,這裡只算做1個,請輸出a的不同子串行的數量。由於答案比...

51Nod1202子串行個數

子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1例如4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。對於給出序列a,有些子串行可能是相同的,這裡只算做1個,請輸出a的不同子串行的數量。由於答案比...

51Nod1202 子串行個數

子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1 p2 pm n。例如4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。對於給出序列a,有些子串行可能是相同的,這裡只算做1個,請輸出a的不同子串行...