fork download
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<string>
  6. #include<queue>
  7. #include<cmath>
  8. #include<set>
  9. #include<map>
  10. #include<vector>
  11. #include<complex>
  12.  
  13. #define fi first
  14. #define se second
  15. #define mp make_pair
  16. #define pb push_back
  17.  
  18. #define REP(a,b,c) for(int a=b,d=c; a<d; a++)
  19. #define REPS(a,b,c) for(int a=b,d=c; a<=d; a++)
  20. #define REPD(a,b,c) for(int a=b,d=c; a>=d; a--)
  21. #define REPI(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
  22. #define RESET(a,b) memset(a,b,sizeof(a))
  23. #define ALL(a) a.begin(),a.end()
  24. using namespace std;
  25.  
  26. typedef long long LL;
  27. typedef pair<int,int> pii;
  28. typedef complex<double> pt;
  29. typedef vector<int> vi;
  30.  
  31. const int INF = 1000000000;
  32. const double EPS = 1e-9;
  33.  
  34. //sicasli's template
  35.  
  36. map<string,int> id;
  37.  
  38. typedef struct
  39. {
  40. int pid,at,bw;
  41. } lho;
  42.  
  43. lho par[100];
  44.  
  45. lho fpar(int p)
  46. {
  47. if (par[p].pid == p) return par[p];
  48. lho tmp = fpar(par[p].pid);
  49.  
  50. int aa = par[p].at * tmp.at;
  51. int bb = par[p].bw * tmp.bw;
  52. int gg = __gcd(aa,bb);
  53.  
  54. par[p].pid = tmp.pid;
  55. par[p].at = aa/gg;
  56. par[p].bw = bb/gg;
  57.  
  58. return par[p];
  59. }
  60.  
  61. void gabung(int a, int b, int xa, int xb)
  62. {
  63. lho para = fpar(a);
  64. lho parb = fpar(b);
  65.  
  66. int aa = xb*parb.bw*para.at;
  67. int bb = xa*parb.at*para.bw;
  68. int gg = __gcd(aa,bb);
  69.  
  70. par[parb.pid].pid = para.pid;
  71. par[parb.pid].at = aa/gg;
  72. par[parb.pid].bw = bb/gg;
  73. }
  74.  
  75. int main()
  76. {
  77. REP(i,0,100)
  78. {
  79. par[i].pid = i;
  80. par[i].at = par[i].bw = 1;
  81. }
  82.  
  83. char z[3];
  84. int n = 0;
  85. while (scanf("%s",z))
  86. {
  87. if (z[0]=='.') break;
  88. if (z[0]=='!')
  89. {
  90. int a,b;
  91. char sa[30],sb[30];
  92. string SA,SB;
  93.  
  94. scanf("%d %s %*s %d %s",&a,sa,&b,sb);
  95.  
  96. int ida,idb,idc;
  97. SA = (string)sa;
  98. SB = (string)sb;
  99.  
  100. if (!id.count(SA)) id[SA] = n++;
  101. if (!id.count(SB)) id[SB] = n++;
  102.  
  103. ida = id[SA];
  104. idb = id[SB];
  105.  
  106. gabung(ida,idb,a,b);
  107.  
  108. lho para = fpar(ida);
  109. lho parb = fpar(idb);
  110. } else
  111. {
  112. int a,b;
  113. char sa[30],sb[30];
  114. string SA,SB;
  115.  
  116. scanf("%s %*s %s",sa,sb);
  117.  
  118. int ida,idb,idc;
  119. SA = (string)sa;
  120. SB = (string)sb;
  121.  
  122. if (!id.count(SA)) id[SA] = n++;
  123. if (!id.count(SB)) id[SB] = n++;
  124.  
  125. ida = id[SA];
  126. idb = id[SB];
  127.  
  128. lho para = fpar(ida);
  129. lho parb = fpar(idb);
  130.  
  131. if (para.pid!=parb.pid)
  132. {
  133. printf("? %s = ? %s\n",sa,sb);
  134. continue;
  135. }
  136.  
  137. int aa = para.at*parb.bw;
  138. int bb = para.bw*parb.at;
  139. int gg = __gcd(aa,bb);
  140.  
  141. printf("%d %s = %d %s\n",aa/gg,sa,bb/gg,sb);
  142. }
  143. }
  144. return 0;
  145. }
  146.  
Success #stdin #stdout 0.01s 5288KB
stdin
! 6 shirt = 15 sock
! 47 underwear = 9 pant
? sock = shirt
? shirt = pant
! 2 sock = 1 underwear
? pant = shirt
.
stdout
5 sock = 2 shirt
? shirt = ? pant
45 pant = 188 shirt