这题说的是给了数字的字符串 然后有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; }