Codeforces Round #265 (Div. 2) E. Substitutes in Number (Mathematics ),
E. Substitutes in Numbertime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard output
Andrew and Eugene are playing a game. Initially, Andrew has stringS, Consisting of digits. Eugene sends Andrew multiple queries of type"DINavigation → navigationTI", That means" replace all digitsDIIn stringSWith substrings equalTI". For example, ifSLatency = Cost 123123, then query "2 latency → 000000" transformsSTo 10031003, and query "3 rows → tables" ("replace 3 by an empty string") transforms itSAuthorization = keys 1212. After all the queries Eugene asks Andrew to find the remainder after division of number with decimal representation equalSBy 1000000007 (109 bytes + Listen 7). When you representSAs a decimal number, please ignore the leading zeroes; also ifSIs an empty string, then it's assumed that the number equals to zero.
Andrew got tired of processing Eugene's requests manually and he asked you to write a program for that. Help him!
Input
The first line contains stringS(1 hour ≤ hour |S| Minimum ≤ limit 105), consisting of digits-the string before processing all the requests.
The second line contains a single integerN(0 bytes ≤ bytesNLimit ≤ limit 105)-the number of queries.
The nextNLines contain the descriptions of the queries.I-Th query is described by string"DI->TI", WhereDIIs exactly one digit (from 0 to 9 ),TIIs a string consisting of digits (TICan be an empty string). The sum of lengthsTIFor all queries doesn' t exceed 105. The queries are written in the order in which they need to be written med.
Output
Print a single integer-remainder of division of the resulting number by 1000000007 (109 bytes + limit 7 ).
Sample test (s) input
12312312->00
Output
10031003
Input
12312313->
Output
1212
Input
22222->00->7
Output
777
Input
10000000080
Output
1
Note
Note that the leading zeroes are not removed from stringSAfter the replacement (you can see it in the third sample ).
Question: Give You A number string and some replacement rules. to output the result of Modulo after replacement, you can use val [I] to represent the number represented by I, base [I] indicates the hexadecimal format used by I. A decimal string s can be expressed as sum (10 ^ (L-I) * s [I]), so all transformations can be converted to multiplication. the Code is as follows:
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1e5+5;const int mod=1e9+7;string a,s[maxn];LL val[10],base[10];int f(char c){ return c-'0';}int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int m; cin>>a>>m; for(int i=0;i<10;i++){ val[i]=i; base[i]=10; } for(int i=1;i<=m;i++)cin>>s[i]; for(int i=m;i>=1;i--){ int L=s[i].size(),res=s[i][0]-'0'; LL v=0,b=1; for(int j=L-1;j>2;j--){ v=(v+val[f(s[i][j])]*b)%mod; b=(b*base[f(s[i][j])])%mod; } val[res]=v; base[res]=b; ///cout<<v<<' '<<b<<endl; } LL ans=0,b=1; int L=a.size(); for(int i=L-1;i>=0;i--){ ans=(ans+b*val[f(a[i])])%mod; b=(b*base[f(a[i])])%mod; } cout<<ans<<endl; return 0;}