Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <string>
  3. #include <vector>
  4. #include <map>
  5. #include <list>
  6. #include<iterator>
  7. #include<set>
  8. #include <queue>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <stack>
  12. #include <deque>
  13. #include <cmath>
  14. #include <memory.h>
  15. #include <cstdlib>
  16. #include <cstdio>
  17. #include <cctype>
  18. #include <algorithm>
  19. #include <utility>
  20. #include <time.h>
  21. #include <complex>
  22. using namespace std;
  23.  
  24. #define FOR(i, a, b) for (int i=(a);i<(b);i++)
  25. #define RFOR(i, b, a) for (int i=(b)-1;i>=(a);--i)
  26. #define REP(i,N) FOR (i, 0, N)
  27. #define RREP (i,N) RFOR (i, N, 0)
  28. #define FILL(A,value) memset(A,value,sizeof(A))
  29.  
  30. #define ALL(V) V.begin(),V.end()
  31.  
  32. #define SZ(V) (int)V.size()
  33. #define PB push_back
  34. #define MP make_pair
  35. #define Pi 3.14159265358979
  36.  
  37. typedef long long Int;
  38. typedef unsigned long long UINT;
  39. typedef vector<int> VI;
  40. typedef pair <int, int> PII;
  41.  
  42. const int INF = 1000000000;
  43. const int MAX = 207;
  44. const int MAX2 = 2000;
  45. const int BASE = 1000000000;
  46.  
  47. int m, n;
  48. string A[MAX];
  49. Int D[21][MAX][MAX];
  50. set< pair<string, string> > S;
  51.  
  52. int main()
  53. {
  54. //freopen("in.txt","r",stdin);
  55. freopen("suffix.in", "r", stdin);
  56.  
  57. int test = 0;
  58. while (1)
  59. {
  60. ++ test;
  61. cin >> A[0];
  62. if (A[0] == ".")
  63. break;
  64.  
  65. cin >> A[1] >> m;
  66. n = 2;
  67. S.clear();
  68. FOR (i,0,m)
  69. {
  70. string a, b;
  71. cin >> a >> b;
  72. A[n ++] = a;
  73. A[n ++] = b;
  74. S.insert(MP(a, b));
  75. }
  76.  
  77. m += 2;
  78.  
  79. for (int len = 1; len <= SZ(A[0]); ++len)
  80. {
  81. FOR (i,0,n)
  82. FOR (j,0,n)
  83. D[len][i][j] = Int(INF) * INF;
  84. FOR (i,0,n)
  85. {
  86. if (SZ(A[i]) < len)
  87. continue;
  88. FOR (j,0,n)
  89. {
  90. if (SZ(A[j]) < len)
  91. continue;
  92. string s1 = "";
  93. string s2 = "";
  94. FOR (k,0,len)
  95. s1 += A[i][SZ(A[i])-len+k];
  96. FOR (k,0,len)
  97. s2 += A[j][SZ(A[j])-len+k];
  98. if (s1 == s2)
  99. D[len][i][j] = 0;
  100. if (S.find(MP(s1, s2)) != S.end())
  101. D[len][i][j] = min(D[len][i][j], 1LL);
  102. if (len > 1 && s1[0] == s2[0])
  103. {
  104. D[len][i][j] = min(D[len][i][j], D[len-1][i][j]);
  105. }
  106. }
  107. }
  108. FOR (t,0,n)
  109. FOR (i,0,n)
  110. FOR (j,0,n)
  111. D[len][i][j] = min(D[len][i][j], D[len][i][t] + D[len][t][j]);
  112. }
  113. Int res = D[SZ(A[0])][0][1];
  114. cout << "Case " << test << ": ";
  115. if (res >= Int(INF) * INF)
  116. cout << "No solution" << endl;
  117. else
  118. cout << res << endl;
  119. }
  120.  
  121. return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement