给一些字母的替换规则,给一个s串。问替换操作n次后,[k,k+m-1]位置的子串是什么。
dp预处理大写字母操作i次的长度。
然后dfs找那段的字母就可以了。
k明摆的是高精度了。贴板吧。
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;
}