sgu284 Grammar 遞推 高精度

2021-07-03 12:32:10 字數 1541 閱讀 8909

題目大意:

有n個字串,每個字元為a或

b ,第

i個字串可以表示為若干個a,

b 和整數j(

j(表示第

j個字串

) 的組合。

給定乙個新的字串

s ,求s在第

n 個字串中出現了多少次。

分析:

很顯然的乙個遞推關係,處理一下合併的情況就好了,細節有一些,而且要用高精度。

ac code:

#include 

#include

#include

#include

#include

#include

#define debug(...) (fprintf(stderr, __va_args__))

using

namespace

std;

const

int maxn = 39;

const

int mod = 1e9;

int n;

int ls;

string s;

string pre[maxn], suf[maxn];

struct bi

void shift()

while(a[len+1])

while(!a[len] && len) len--;

if(!len) len = 1;

}friend bi operator + (const bi &a, const bi &b)

friend bi operator + (const bi &a, int k)

friend

bool

operator > (const bi &a, int k)

if(a.len > b.len) return

true;

else

if(a.len < b.len) return

true;

else

}void print()

}f[maxn], l[maxn];

int count(const

string &str)

int main()

suf[i] += suf[j];

if(suf[i].size() > ls-1)

suf[i] = suf[i].substr(suf[i].size()-ls+1, ls-1);

f[i] = f[i]+f[j], l[i] = l[i]+l[j], tmp += pre[j];

if(l[j] > ls-1)

}else

}if(tmp.size()) f[i] = f[i]+count(tmp);

}f[n].print();

#ifndef online_judge

fclose(stdin);

fclose(stdout);

#endif

return

0;}