Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 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 long long mod = 1e9 + 7;
  19. const 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. unsigned long long getHash(vector<unsigned long long> & hash, int l, int r) {
  28. return (hash[r + 1] - (hash[l] * step[r - l + 1]));
  29. }
  30. int main() {
  31. string s1, s2;
  32. int nn;
  33. cin >> nn;
  34. cin >> s1;
  35. cin >> s2;
  36. vector<unsigned long long> hash1(1);
  37. vector<unsigned long long> hash2(1);
  38.  
  39. for (int i = 0; i < s1.size(); i++) {
  40. hash1.push_back(hash1[i] * lmod + getNum(s1[i]));
  41. step.push_back(step[i] * lmod);
  42. }
  43. for (int i = 0; i < s2.size(); i++) {
  44. hash2.push_back(hash2[i] * lmod + getNum(s2[i]));
  45. }
  46. int l = 0;
  47. int r = hash1.size();
  48. while (l + 1 < r) {
  49. int m = (l + r) / 2;
  50. bool f = true;
  51. set<unsigned long long> se;
  52. for (int i = 0; i + m < hash1.size() - 1; i++) {
  53. se.insert(getHash(hash1, i, i + m));
  54. }
  55. for (int i = 0; i + m < hash2.size() - 1; i++) {
  56. if (se.find(getHash(hash2, i, i + m)) != se.end()) {
  57. l = m;
  58. f = false;
  59. break;
  60. }
  61. }
  62. if (f)
  63. r = m;
  64. }
  65. set<unsigned long long> se;
  66. for (int i = 0; i + l < hash1.size() - 1; i++) {
  67. se.insert(getHash(hash1, i, i + l));
  68. }
  69. int lg, rg;
  70. for (int i = 0; i + l < hash2.size() - 1; i++) {
  71. if (se.find(getHash(hash2, i, i + l)) != se.end()) {
  72. lg = i;
  73. rg = i + l;
  74. }
  75. }
  76. string ans;
  77. for (int i = lg; i <= rg; i += 1)
  78. ans += s2[i];
  79. cout << ans;
  80. return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement