有乙個定義在 \(\\) 上的合規表示式,包含三種基本的操作:
結合:\(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 ...