您的位置:首页 > 产品设计 > UI/UE

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: