NOIP2002普及T3【产生数】

做完发现居然没人用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;
}
posted @ 2018-05-25 16:14  Ivanovcraft  阅读(421)  评论(0编辑  收藏  举报