hdu4693 Huge String,高精度,dp

6 篇文章 0 订阅
3 篇文章 0 订阅
给一些字母的替换规则,给一个s串。问替换操作n次后,[k,k+m-1]位置的子串是什么。

dp预处理大写字母操作i次的长度。
然后dfs找那段的字母就可以了。

k明摆的是高精度了。贴板吧。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define maxl 50
#define bbit 4
#define bsize 10000

int bsav[10]={1,10,100,1000};

struct bign{
    int l,s[maxl];
    bign(){l=0;memset(s,0,sizeof(s));}
    void init(){l=0;memset(s,0,sizeof(s));}
    bign operator =(int a){
        this->init();
        while(a){s[l++]=a%bsize;a=a/bsize;}
        while(l&&s[l]==0) --l;
        return *this;
    }
    bign operator =(long long a){
        this->init();
        while(a){s[l++]=a%bsize;a=a/bsize;}
        while(l&&s[l]==0) --l;
        return *this;
    }
    bign operator =(char *a){
        this->init();
        int tmp,i,j,tl=strlen(a);
        for(i=tl-1;i>=bbit;i-=bbit){
            tmp=0;
            for(j=bbit-1;j>=0;--j){
                tmp=tmp*10+a[i-j]-'0';
            }
            s[l++]=tmp;
        }
        tmp=0;
        for(j=0;j<=i;++j){
            tmp=tmp*10+a[j]-'0';
        }
        s[l++]=tmp;
        while(l&&s[l]==0) --l;
        return *this;
    }

    bool operator ==(bign b){
        if (l!=b.l) return false;
        for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return false;
        return true;
    }

    bool operator <(bign b){
        if (l!=b.l) return l<b.l;
        for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return s[i]<b.s[i];
        return false;
    }

    bool operator !=(bign b){return !(*this==b);}
    bool operator <=(bign b){return *this<b||*this==b;}
    bool operator > (bign b){return b<*this;}
    bool operator >=(bign b){return b<*this||*this==b;}

    bign operator +(bign b){
        bign r;
        r.l=l>b.l?l:b.l;
        int i,c=0;
        for(i=0;i<=r.l;++i){
            r.s[i]=s[i]+b.s[i]+c;
            c=r.s[i]/bsize;
            r.s[i]%=bsize;
        }
        if (c) r.s[++r.l]=c;
        return r;
    }
    bign operator +(int b){bign r;r=b;return *this+r;}
    bign operator +=(bign b){return *this=*this+b;}
    bign operator +=(int b){return *this=*this+b;}


    bign operator -(bign b){
        bign r;
        r.l=l;
        int i,c=0;
        for(i=0;i<=l;++i){
            r.s[i]=s[i]-b.s[i]+c;
            if (r.s[i]<0) {c=-1;r.s[i]+=bsize;}
            else c=0;
        }
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator -(int b){bign r;r=b;return *this-r;}
    bign operator -=(bign b){return *this=*this-b;}
    bign operator -=(int b){return *this=*this-b;}


    bign operator *(bign b){
        bign r;
        int i,j;
        for(i=0;i<=l;++i){
            for(j=0;j<=b.l;++j){
                r.s[i+j]+=s[i]*b.s[j];
                if (r.s[i+j]>=bsize)
                    {r.s[i+j+1]+=r.s[i+j]/bsize;r.s[i+j]%=bsize;}
            }
        }

        r.l=l+b.l+1;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator *(long long b){//caution for long long overflow
        bign r;
        int i;
        long long t=0;
        for(i=0;i<=l;++i){
            t+=s[i]*b;
            r.s[i]=t%bsize;
            t=t/bsize;
        }
        r.l=l;
        while(t){r.s[++r.l]=t%bsize;t=t/bsize;}
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator *=(bign b){return *this=*this*b;}
    bign operator *=(long long b){return *this=*this*b;}

    void shlnadd(int val){
        for(int i=l;i>=0;--i){s[i+1]=s[i];}
        s[0]=val;
        ++l;
        while(l&&s[l]==0) --l;
    }

    bign operator /(bign b){
        bign r,t;
        int i,j;
        bign tb[bbit];
        for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
        for(i=l;i>=0;--i){
            t.shlnadd(s[i]);
            for(j=bbit-1;j>=0;--j){
                while(tb[j]<=t){
                    t-=tb[j];
                    r.s[i]+=bsav[j];
                }
            }
        }
        if (l>b.l) r.l=l-b.l;
        else r.l=0;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator /(int b){ //caution for int overflow:1000*b
        int i,j;
        bign r;
        int tb[bbit];
        int t=0;
        for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
        for(i=l;i>=0;--i){
            t=t*bsize+s[i];
            for(j=bbit-1;j>=0;--j){
                while(tb[j]<=t){
                    t-=tb[j];
                    r.s[i]+=bsav[j];
                }
            }
        }
        r.l=l;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }

    //bign operator /(int b){bign r;r=b;return *this/r;}
    bign operator /=(bign b){return *this=*this/b;}
    bign operator /=(int b){return *this=*this/b;}

    void print(int func){
        printf("%d",s[l]);
        for(int i=l-1;i>=0;--i) printf("%04d",s[i]);
        if (func) puts("");
    }
};

int len[50];
bign dp[30][110];
bign be,en;
int n;

char hehe[28][50]={
"ACM-ICPC",
"BIDU",
"consonant:BCDFGHJKLMNPQRSTVXZWY",
"D41D8CD98F00B204E9800998ECF8427E",
"2.718281828459...",
"0xFACEB00C",
"1E100.net",
"\\Huge{String}",
"InternationalCollegiateProgrammingContest",
"JinKeLa",
"KeepItSimpleStupid",
"1000mL",
"Micro$oftCorp",
"",
"Oops",
"pneumonoultramicroscopicsilicovolcanoconiosis",
"A",
"P",
"M",
"TheQuickBrownFoxJumpsOverTheLazyDog",
"\\bigcup",
"vowel:AEIOU",
"WWW",
"X-ray",
"YOOOOOO!",
"ZheJiangUniversity"
};

int isupper(char c){return c<='Z'&&c>='A';}

void init(){
    int i,j,k,id;

    for(i=0;i<26;++i){
        len[i]=strlen(hehe[i]);
        dp[i][1]=len[i];
    }

    for(i=2;i<=100;++i){
        for(j=0;j<26;++j){
            dp[j][i]=0;
            for(k=0;k<len[j];++k){
                if (isupper(hehe[j][k])){
                    id=hehe[j][k]-'A';
                    dp[j][i]+=dp[id][i-1];
                }
                else dp[j][i]+=1;
            }
        }
    }
}

void dfs(int dep,char s[],bign now){
    int i;
    bign nt;
    int l=strlen(s);

    for(i=0;i<l;++i){
        if (now>en) return;
        if (dep==n){
            if (now>=be) printf("%c",s[i]);
            now+=1;
            continue;
        }

        if (isupper(s[i])){
            nt=now+dp[s[i]-'A'][n-dep];
            if (nt>=be) {
                char ts[50];
                strcpy(ts,hehe[s[i]-'A']);
                dfs(dep+1,ts,now);
            }
            now=nt;
        }
        else{
            if (now>=be){
                printf("%c",s[i]);
            }
            now+=1;
        }
    }
}

char s[200];
char bs[200];

int main(){
    //freopen("4693in.txt","r",stdin);
    int l,m;
    bign now;
    init();
    while(gets(s)){
        l=strlen(s);
        scanf("%d%d%s",&n,&m,bs);
        getchar();
        be=bs;
        en=be+m-1;
        now=0;
        dfs(0,s,now);
        printf("\n");
    }
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值