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)output第2 - n + 1行:序列中的元素(1 <= a[i] <= 100000)
輸出a的不同子串行的數量mod 10^9 + 7。input示例
412output示例32
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的不同子串行...