Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <iomanip>
  4. #include <set>
  5. #include <queue>
  6. #include <map>
  7. #include <string>
  8. #include <algorithm>
  9. #include <random>
  10. #include <math.h>
  11. //#pragma GCC optimize("OFast", "O3", "unroll-loops", "omit-frame-pointer", "inline");
  12. //#pragma GCC target("sse", "sse2", "sse3", "ssse3", "sse4", popcnt, abm, mmx, avx);
  13. //#pragma GCC option("tune=native", "arch=native", "no-zero-upper");
  14. //#pragma clang loop vectorize_width(4) interleave_count(4);
  15. //#pragma clang loop unroll(disable);
  16. using namespace std;
  17. const int INF = 1e9;
  18. const unsigned long long mod = 2000010151;
  19. const unsigned long long lmod = 31;
  20. const double delta = 10e-18;
  21. vector<unsigned long long> step(1, 1);
  22.  
  23. int getNum(char num) {
  24. return (num - 'A' + 1);
  25. }
  26.  
  27. long long getHash(vector<unsigned long long> & hash, int l, int r) {
  28. return (((hash[r + 1] - (hash[l] * step[r - l + 1]) % mod) + mod) % mod);
  29. }
  30. bool edent(string & s1, string & s2, int s1l, int s1r, int s2l, int s2r) {
  31. int dif = (s2l - s1l);
  32. for (int i = s1l; i <= s1r; i++) {
  33. if (s1[i] != s2[i + dif]) {
  34. return false;
  35. }
  36. }
  37. return true;
  38. }
  39.  
  40. int main() {
  41. string s1, s2;
  42. int n;
  43. cin >> n;
  44. cin >> s1;
  45. cin >> s2;
  46. vector<unsigned long long> hash1(1);
  47. vector<unsigned long long> hash2(1);
  48.  
  49. for (int i = 0; i < s1.size(); i++) {
  50. hash1.push_back((hash1[i] * lmod + getNum(s1[i])) % mod);
  51. step.push_back((step[i] * lmod) % mod);
  52. }
  53. for (int i = 0; i < s2.size(); i++) {
  54. hash2.push_back((hash2[i] * lmod + getNum(s2[i])) % mod);
  55. }
  56. int l = 0;
  57. int r = hash1.size() - 1;
  58. while (l + 1 < r) {
  59. int m = (l + r) / 2;
  60. bool f = true;
  61. set< unsigned long long> se;
  62. for (int i = 0; i + m < hash1.size() - 1; i++) {
  63. se.insert(getHash(hash1, i, i + m));
  64. }
  65. int lSide, rSide;
  66. for (int i = 0; i + m < hash2.size() - 1; i++) {
  67. if (se.find(getHash(hash2, i, i + m)) != se.end()) {
  68. lSide = i;
  69. rSide = i + m;
  70. int hashLside = getHash(hash2, lSide, rSide);
  71. for (int i = 0; i + m < hash1.size() - 1; i++) {
  72. if (getHash(hash1, i, i + m) == hashLside && edent(s1, s2, i, i + m, lSide, rSide)) {
  73. l = m;
  74. f = true;
  75. break;
  76. }
  77. }
  78. if (f) {
  79. f = false;
  80. break;
  81. }
  82. }
  83. }
  84. if (f)
  85. r = m;
  86. }
  87.  
  88. set<unsigned long long> se;
  89. for (int i = 0; i + l < hash1.size() - 1; i++) {
  90. se.insert(getHash(hash1, i, i + l));
  91. }
  92. int lg, rg;
  93. for (int i = 0; i + l < hash2.size() - 1; i++) {
  94. if (se.find(getHash(hash2, i, i + l)) != se.end()) {
  95. lg = i;
  96. rg = i + l;
  97. }
  98. }
  99. string ans;
  100. for (int i = lg; i <= rg; i += 1)
  101. ans += s2[i];
  102. cout << ans;
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement