XSY3139 預言家 數字DP NFA

2022-03-25 17:28:14 字數 1716 閱讀 4641

有乙個定義在 \(\\) 上的合規表示式,包含三種基本的操作:

結合:\(e_1e_2\)

分配:\((e_1|e_2|\ldots|e_n),n\geq 2\)

重複:\((e_1)* ,n\geq 0\)

給你 \(l,r\),問你有多少個 \([l,r]\) 之間不含前導零的整數能匹配這個合規表示式。

\(1\leq l\leq r\leq ^\)

直接建出這個合規表示式對應的 nfa,在上面跑數字 dp 即可。

記錄 \(f_\) 表示還需要確定後 \(i\) 位,前面這幾位是否比 \(n\) 小,在 nfa 上面可以達到的狀態集合是 \(j\) 時的方案數。

時間複雜度:\(o(???)\)

#include#include#include#includeusing namespace std;

typedef long long ll;

char s[100];

int c[100];//另乙個括號的位置

int n;

int st[100];

int top;

int b[100][100];//epsilon

int nxt[100];

int move(int x,int v)

void init()

memset(b,0,sizeof b);

for(int i=1;i<=n+1;i++)

b[i][i]=1;

for(int i=1;i<=n;i++)

if(s[i]=='(')

else}}

} else if(s[i]==')')

else if(s[i]=='*')

b[i][i+1]=1;

for(int k=1;k<=n+1;k++)

for(int i=1;i<=n+1;i++)

for(int j=1;j<=n+1;j++)

b[i][j]|=b[i][k]&&b[k][j];

memset(nxt,0,sizeof nxt);

for(int i=1;i<=n+1;i++)

for(int j=1;j<=n+1;j++)

if(b[i][j])

nxt[i]|=1<<(j-1);

}int len;

int a[100];

mapf[100][2];

ll calc(ll m)

for(int i=0;i<=len;i++)

for(int i=1;i<=a[len];i++)

f[len-1][i==a[len]][move(nxt[1],i)]++;

for(int i=len-1;i>=1;i--)

for(int j=1;j<=9;j++)

f[i-1][0][move(nxt[1],j)]++;

for(int i=len;i>=1;i--)

for(auto v:f[i][0])

if(v.first)

}ll res=0;

for(int i=0;i<=1;i++)

for(auto v:f[0][i])

if((v.first>>n)&1)

res+=v.second;

return res;

}void solve()

int main()

3 13學習總結

貪心演算法 實質 直接去求每一步的最優解,通過若干次的貪心選擇,從而得到整個問題的最優解。不是整體上考慮問題,而是找區域性的最優解 利用貪心解題策略 判斷該題是否適用於貪心策略求解 如何選擇貪心標準,以得到問題的最優解 貪心的一般解題思路 1 候選集合a 2 解集合s 3 解決函式solution ...

3 1 3 控制結構

jinja2 提供了多種控制結構,可用來改變模板的渲染流程。本節使用簡單的例子介紹其中 最有用的控制結構。下面這個例子展示了如何在模板中使用條件控制語句 hello,hello,stranger 另一種常見需求是在模板中渲染一組元素。下例展示了如何使用 for 迴圈實現這一需求 jinja2 還支援...

Linux基礎指令 3 13

1 檔案搜尋 find find etc name 在目錄 etc中查詢檔案 size n 大於 n 小於 n 等於 在根目錄下查詢大於100mb的檔案 home user 根據使用者名稱查詢檔案 cmin 根據時間查詢修改過屬性的檔案和目錄 etc name exec 起乙個橋梁的作用 ls l ...