1. 程式人生 > >NOIP2002普及T3【產生數】

NOIP2002普及T3【產生數】

AC 選擇 高精 能夠 har col sans cout 多個

做完發現居然沒人用map搞映射
特意來補充一發


很容易看出這是一道搜索題
考慮搜索方案,如果按字符串轉移,必須存儲每種狀態,空間復雜度明顯會爆炸
觀察到每一位之間是互不影響的


考慮使用乘法原理
搜索出每一位的情況總數,求它們的連乘積即為答案


時間復雜度O(n2^k)
可以看出答案最大可以達到三十的十次方,會爆掉long long,所以需要寫高精


具體處理可以選擇STL(懶得自己寫)
對於映射,這是map的專長
如果一個數能夠映射到多個數呢?
用map的時候從char映射到vector<char>即可


代碼:

#include<iostream>
#include<cstdio>
#include
<map> #include<vector> #include<cstring> using namespace std; map<char,vector<char> >mp; string st; int k,l,c[10],mul[100]; void dfs(char th) { c[th-0]=1; int sz=mp[th].size(); for(int i=0;i<sz;i++) if(!c[mp[th][i]-0]) dfs(mp[th][i]); } signed main() { cin
>>st>>k; l=st.length(); for(int i=1;i<=k;i++) { char x,y; cin>>x>>y; mp[x].push_back(y); } mul[0]=1; for(int i=0;i<l;i++) { memset(c,0,sizeof(c)); dfs(st[i]); int sum=0; for(int i=0;i<=9;i++) sum
+=c[i]; int x=0; for(int i=0;i<100;i++) { mul[i]=mul[i]*sum+x; x=mul[i]/10; mul[i]%=10; } } int i=99; while(i>0&&!mul[i]) i--; for(;i>=0;i--) cout<<mul[i]; cout<<endl; return 0; }

NOIP2002普及T3【產生數】