Codeforces Round #265 (Div. 2) E

这题说的是给了数字的字符串 然后有n种的操作没次将一个数字替换成另一个字符串,求出最后形成的字符串的 数字是多大,我们可以逆向的将每个数推出来,计算出他的值和位数记住位数用10的k次方来记 1位就是10 2位就是100,这样是为了防止当位数很大的时候存不下这样可以直接的进行mod操作

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
const int max_n=100005;
const ll mod= 1000000007;
struct point{
   ll val,loc;
}digit[9];
char str[max_n];
vector<int> F[max_n];
char S[max_n];
int n;
int main()
{
     while(scanf("%s",str)==1){
       for(int i=0; i<10; ++i)
            digit[i].loc=10,digit[i].val=i;
      scanf("%d",&n);
        for(int i=0; i<n; i++){
            F[i].clear();
           scanf("%s",S);
           F[i].push_back(S[0]-'0');
           int len=strlen(S);
           for(int j=3; j<len; ++j)
            F[i].push_back(S[j]-'0');
        }
        for(int i =n-1; i>=0; --i )
        {
            ll val=0,loc=1;
            int L =F[i].size();
            for(int k=L-1; k>0; --k){
                int t =F[i][k];
                val=(val+loc*digit[t].val)%mod;
                loc=(loc*digit[t].loc)%mod;
            }
            digit[F[i][0]].loc=loc;
            digit[F[i][0]].val=val;
        }
        ll ans=0,loc=1;
        int L =strlen(str);
        for(int i=L-1; i>=0; --i){
              ll t= str[i]-'0';
              ans=(ans+digit[t].val*loc)%mod;
              loc=(loc*digit[t].loc)%mod;
        }
        printf("%I64d
",ans);
     }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Opaser/p/3977173.html