syhd142 |
|
|||
日歷
統計
導航常用鏈接留言簿(2)隨筆檔案(23)文章分類(270)
文章檔案(122)我的豆瓣搜索最新評論
閱讀排行榜
評論排行榜 |
題意:在一個母串X中找出字串Z出現的最大次數。 解法:很明顯的DP;狀態表示:用a[i][j]表示字串的前i個在母串的前j個中出現得最大次數;轉移方程:始終有a[i][j] = a[i][j-1],因為字串前i個在母串前j-1個中出現的次數顯然也會在母串前j個出現,當x[j]==z[i]時,還要加上字串前i-1個在母串前j-1個出現的次數。可以轉化為一維的,具體見代碼: #include<iostream>
#include<algorithm> using namespace std; #define Base 1000000000 #define Cap 30 typedef long long hugeint; struct bignum { int Len; int Data[Cap]; bignum() : Len(0){} bignum(const bignum &V) : Len(V.Len) { memcpy(Data,V.Data,Len * sizeof*Data); } bignum(int V) : Len(0) { for(;V > 0;V /= Base) Data[Len++] = V % Base; } bignum &operator = (const bignum &V) { Len = V.Len; memcpy(Data,V.Data,Len * sizeof*Data); return *this; } int &operator[](int Index) { return Data[Index]; } int operator[](int Index) const { return Data[Index]; } }; bignum operator+(const bignum &A, const bignum &B) { bignum R; int i; int Carry = 0; for(i = 0; i < A.Len || i < B.Len || Carry > 0; i++) { if(i < A.Len) Carry += A[i]; if(i < B.Len) Carry += B[i]; R[i] = Carry % Base; Carry /= Base; } R.Len = i; return R; } ostream& operator<<(ostream &Out, const bignum &V) { int i; Out << (V.Len == 0 ? 0 : V[V.Len - 1]); for(i = V.Len - 2; i >= 0; i--) for(int J = Base / 10; J > 0; J /= 10) Out << V[i] / J % 10; return Out; } #define M 105 #define N 10005 bignum d[M]; char s1[N], s2[M]; int main() { int t, l1, l2; scanf("%d", &t); while(t--) { scanf("%s %s", &s1, &s2); l1 = strlen(s1), l2 = strlen(s2); for(int i = 1; i <= l2; i++) d[i] = bignum(0); d[0] = bignum(1); for(int i = 1; i <= l1; i++) for(int j = l2; j >= max(l2 - l1 + i, 1); j--) { if(s1[i - 1] == s2[j - 1]) { d[j] = d[j] + d[j - 1]; } } cout <<d[l2]<<endl; } return 0; }
評論:
|
![]() |
|
Copyright © Fucker | Powered by: 博客園 模板提供:滬江博客 |