NOIP2002普及T3【產生數】
阿新 • • 發佈:2018-05-25
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【產生數】