UVa 10069 - Distinct Subsequences
2013-06-23 20:11
309 查看
/* dp + 大数模板 */ #include <cstring> #include <cstdio> #include <algorithm> #include <iostream> #include <cmath> using namespace std; const int MAXX = 10002, MAXZ = 102; char X[MAXX], Z[MAXZ]; int x, z; #define MAX_N 1020 //最大位数 //大数 struct bign { char s[MAX_N]; int len; bign() { memset(s, 0, sizeof(s)); len = 1; } bign(int num) { *this = num; } bign(const char *num) { *this = num; } bign operator = (const char *num) { len = strlen(num); for(int i=0; i<len && num[len-1-i]>='0' && num[len-1-i]<='9'; i++) { s[i] = num[len-1-i] - '0'; } while(len > 1 && s[len-1] == 0) len--; return *this; } bign operator = (int num) { char s[MAX_N]; sprintf(s, "%d", num); *this = s; return *this; } bign operator + (const bign &b) const { bign c; int m = len > b.len ? len : b.len; int i, g, sum; for(i=0, g=0; g || i< m; i++) { sum = g; if(i < len) sum += s[i]; if(i < b.len) sum += b.s[i]; c.s[i] = sum%10; g = sum / 10; } c.len = i; return c; } bign operator += (const bign &b) { *this = *this + b; return *this; } bign operator * (const bign &b) const { bign c; int i, j, g, sum; for(i=0; i<b.len; i++) { g = 0; for(j=0; g||j<len; j++) { sum = c.s[i+j] + g; if(j < len) sum += b.s[i]*s[j]; c.s[j+i] = sum % 10; if(c.s[j+i] > 0) c.len = i+j+1; g = sum / 10; } } return c; } bign operator *= (const bign &b) { *this = *this * b; return *this; } bign operator / (const int b) const { bign c; long long a=0; int i=0; char r[1000]; int j = 0; bool start = false; for(i=len-1; i>=0; i--) { a = a*10 + s[i]; if(!start && (a/b!=0)) start = true; if(start) { r[j++] = a/b; } a = a%b; } if(start) { c.len = j; for(i=j-1; i>=0; i--) { c.s[j-1-i] = r[i]; } return c; } else { return 0; } } bign operator /= (const int b) { *this = *this / b; return *this; } int operator % (const int b) { long long a=0; int i=0; for(i=len-1; i>=0; i--) { a = a*10 + s[i]; a = a%b; } return (int)a; } bool operator < (const bign &b) const { if(b.len != len) return len < b.len; int i; for(i=len-1; i>=0; i--) { if(s[i] != b.s[i]) return s[i] < b.s[i]; } return false; } bool operator > (const bign &b) const { return b < *this;} bool operator <= (const bign &b) const {return !(*this > b);} bool operator >= (const bign &b) const {return !(*this < b);} bool operator != (const bign &b) const {return (*this < b) || (*this > b);} bool operator == (const bign &b) const {return !(*this < b) && !(*this > b);} }; ostream& operator << (ostream& outstream, const bign& b) { for(int i=b.len-1; i>=0; i--) { outstream << (int)b.s[i] << ""; } return outstream; } istream& operator >> (istream& instream, bign& b) { string s; instream >> s; b = s.c_str(); return instream; } bign d[MAXZ]; // d[i]: 前i个字符组成形式有多少种,属于滚动数组 void dp(){ x = strlen(X); z = strlen(Z); for(int i=0; i<x; i++) { for(int j=z-1; j>=0; j--) { if(X[i] == Z[j]) { if(j) d[j] += d[j-1]; else d[0] += 1; } } } } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int T; scanf("%d", &T); while(T--) { scanf("%s%s", X, Z); memset(d, 0, sizeof(d)); dp(); cout << d[z-1] << endl; } return 0; }
相关文章推荐
- UVa 10069 Distinct Subsequences(大数 DP)
- UVa 10069 Distinct Subsequences(经典DP)
- UVA 10069 ---Distinct Subsequences +DP+大数
- uva 10069 Distinct Subsequences(dp,大数加法)
- uva 10069 - Distinct Subsequences(大数相加+DP)
- uva 10069(dp)
- UVa 10069 Distinct Subsequences 简单dp+java大数
- uva 10069 Distinct Subsequences 【dp+大数】
- UVa:10069 Distinct Subsequences
- UVA 10069 Distinct Subsequences(dp + 高精度)
- uva_10069_Distinct Subsequences (普通DP)
- UVA - 10069 Distinct Subsequences
- UVa 10069 - Distinct Subsequences
- UVA 10069 Distinct Subsequences
- UVa 10069 - Distinct Subsequences
- uva10069 - Distinct Subsequences(动规,大数)
- UVA 10069 Distinct Subsequences(DP)
- uva10069 - Distinct Subsequences(大数+DP)
- uva 10069
- uva 10069