Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 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 = 1300010197;
  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.  
  57. int l = 0;
  58. int r = hash1.size() - 1;
  59. while (l + 1 < r) {
  60. int m = (l + r) / 2;
  61. set< unsigned long long> se;
  62. map<unsigned long long, pair<int, int>> d;
  63. for (int i = 0; i + m < hash1.size() - 1; i++) {
  64. unsigned long long heshLocal = getHash(hash1, i, i + m);
  65. se.insert(heshLocal);
  66. d[heshLocal] = {i, i + m};
  67. }
  68. int lSide, rSide;
  69. bool f = true;
  70. for (int i = 0; i + m < hash2.size() - 1; i++) {
  71. if (se.find(getHash(hash2, i, i + m)) != se.end()) {
  72. unsigned long long heshLocal = getHash(hash2, i, i + m);
  73. lSide = d[heshLocal].first;
  74. rSide = d[heshLocal].first;
  75. if (edent(s1, s2,lSide, rSide, i, i+m)) {
  76. l = m;
  77. f = false;
  78. break;
  79. }
  80. }
  81. }
  82. if (f)
  83. r = m;
  84. }
  85.  
  86. set<unsigned long long> se;
  87. for (int i = 0; i + l < hash1.size() - 1; i++) {
  88. se.insert(getHash(hash1, i, i + l));
  89. }
  90. int lg, rg;
  91. for (int i = 0; i + l < hash2.size() - 1; i++) {
  92. if (se.find(getHash(hash2, i, i + l)) != se.end()) {
  93. lg = i;
  94. rg = i + l;
  95. }
  96. }
  97. string ans;
  98. for (int i = lg; i <= rg; i += 1)
  99. ans += s2[i];
  100. cout << ans;
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement