fork download
  1. /*
  2.   --------------------------------DO NOT COPY I REQUEST YOU PLEASE--------------------------
  3.  
  4.   AUTHOR : Chandan Agrawal
  5.   College : Poornima College of Engg. jaipur, Raj
  6.   Mail : chandanagrawal23@gmail.com
  7.  
  8.   */
  9.  
  10. #include<bits/stdc++.h>
  11. #include<stdio.h>
  12. using namespace std;
  13.  
  14. #define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  15. #define MAX 100050
  16.  
  17. #define ll long long
  18. #define ld long double
  19. #define lli long int
  20.  
  21. #define pb emplace_back
  22. #define INF 1000000000
  23. #define mod 1000000007
  24. #define MOD 1000000007
  25.  
  26. // trignometric function always give value in Radians only
  27. #define PI acos(-1) //3.1415926535897932384626433832795028
  28. #define dsin(degree) sin(degree*(PI/180.0))
  29. #define dcos(degree) cos(degree*(PI/180.0))
  30. #define dtan(degree) tan(degree*(PI/180.0))
  31.  
  32. #define rsin(radian) sin(radian)
  33. #define rcos(radian) cos(radian)
  34. #define rtan(radian) tan(radian)
  35.  
  36. #define loop(i,n) for (lli i = 0; i < n; i++)
  37. #define loopitr(xt,vec) for (auto xt : vec)
  38. #define FOR(i,a,b) for (lli i = a; i < b; i+=1)
  39. #define loop_rev(i,n) for (lli i = n-1; i >= 0; i--)
  40. #define FOR_REV(i,a,b) for (lli i = a; i >= b; i--)
  41. #define itr :: iterator it
  42. #define WL(t) while(t --)
  43.  
  44. #define all(v) v.begin(),v.end()
  45. #define makeuniq(v) v.resize(unique(all(v)) - v.begin()); //only uniq element in vector after this
  46. #define sz(x) int(x.size())
  47. #define F first
  48. #define S second
  49.  
  50. #define mii map<lli,lli>
  51. #define vi vector<lli>
  52. #define seti set<lli>
  53. #define pii pair<lli,lli>
  54.  
  55. #define gcd(a,b) __gcd((a),(b))
  56. #define lcm(a,b) (a/gcd(a,b))*b
  57. #define abs(x) ((x < 0)?-(x):x)
  58.  
  59. template <typename T>
  60. void print(T x){cout<<x<<endl;}
  61. template <typename T1, typename T2>
  62. void print2(T1 x,T2 y){cout<<x<<" "<<y<<endl;}
  63. template <typename T1, typename T2,typename T3>
  64. void print3(T1 x, T2 y,T3 z){cout<<x<<" "<<y<<" "<<z<<endl;}
  65.  
  66. #define scanarr(a,n) for(lli i=0;i<n;i++) cin>>a[i];
  67. #define scanvector(a,n) for(lli i=0;i<n;i++){ lli x ; cin>>x; a.push_back(x);}
  68.  
  69. #define printarr(a,n) for(lli i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl;
  70. #define printvector(vec) for(auto xt : vec) cout<<xt<<" "; cout<<"\n";
  71. #define printset(st) for(auto xt : st) cout<<xt<<" "; cout<<"\n";
  72.  
  73. #define FD(N) fixed<<setprecision(N)
  74.  
  75. #define endl '\n'
  76.  
  77. #define deb(x) cout<<#x<<" "<<x<<endl;
  78.  
  79. /*
  80.   ifstream cinn("i3.txt");
  81.   ofstream coutt("o3.txt");
  82.   */
  83.  
  84.  
  85. bool isvowel(char v) { return (0x208222>>(v&0x1f))&1; }
  86.  
  87. lli mceil(lli a,lli b){
  88. if(a%b==0) return(a/b);
  89. else return(a/b +1);
  90. }
  91. lli mfloor(lli a,lli b){
  92. return(a/b);
  93. }
  94.  
  95. ll modmul(ll a, ll b) {
  96. return ((a%mod) * (b%mod)) % mod;
  97. }
  98.  
  99. ll modadd(ll a , ll b){
  100. return((a%mod)+(b%mod)+mod)%mod;
  101. }
  102.  
  103. ll modsub(ll a , ll b){
  104. return((a%mod) - (b%mod) + mod)%mod;
  105. }
  106.  
  107. lli fastexpo(lli a,lli b){
  108. a = a%mod;
  109. lli ans=1;
  110. while(b){
  111. if(b&1)
  112. ans=(ans*1ll*a)%mod;
  113. a=(a*1ll*a)%mod;
  114. b=b/2;
  115. }
  116. return ans;
  117. }
  118.  
  119.  
  120.  
  121. /* -----------------------------------------------------HASHING-------------------------------------------------------------------*/
  122. /*
  123.   some key points -
  124.   1. Use (long int) to remove TLE or Memory Limit issue
  125.   2. If still Wrong answer then may be collision occur , use p as bigger prime no. p : [31,53,107,209,4793]
  126.   3. use mod either 1e9+7
  127.   4 .If it still shows WA then surely collision occurs use Double Hashing
  128.   Double Hashing -
  129.   Make Prehash Array using two different p and mod so chances of collision is less
  130.   5. use pass by reference always
  131.  
  132.  
  133.   */
  134.  
  135. #define maxlen 1000005 //maximum length of string
  136.  
  137. lli pow_p[maxlen]; // p^i %m
  138. lli p_inv[maxlen]; // this is inverse_Mod(p^i) basically p^(-n) = [p^(-1) ]^n so calculate just p^(-1) and caluclate power
  139. // like inversemod(p^(-2)) = p^(-1) * p^(-1)
  140. void init(lli p)
  141. {
  142. pow_p[0]=1;
  143. p_inv[0]=1;
  144. lli pinv = fastexpo(p,mod-2);
  145. for(lli i=1;i<maxlen;i++)
  146. {
  147. pow_p[i] = modmul(pow_p[i-1],p);
  148. p_inv[i] = modmul(p_inv[i-1],pinv);
  149. }
  150.  
  151. }
  152.  
  153. struct Hash{
  154. // 0 based indexing
  155. lli prehash[maxlen];
  156. // hash(s) = sigma(i=0 to n-1) s[i]*p^(i)
  157. // a->1 , b->2 , c->3 and so on
  158.  
  159.  
  160. void precomputehash(string &s){ //p can be any prime 19 , 31, 53,107 ...
  161.  
  162.  
  163. prehash[0]=(s[0])+1;
  164. for (lli i=1;i<s.size();i++) {
  165. prehash[i]= modadd(prehash[i-1] , modmul((s[i]+1),pow_p[i]));
  166. }
  167. }
  168.  
  169. // hash[l..r] = ((hash[upto r] - hash[upto (l-1)] ) / P^l) % mod = ((hash[upto r] - hash[upto (l-1)] ) * modinv(P^l) )%mod
  170. lli gethash(lli l, lli r){
  171. if(l==0)
  172. return(prehash[r]%mod);
  173. else{
  174. lli ans = modsub(prehash[r],prehash[l-1]);
  175. ans = modmul(ans, p_inv[l]);
  176. return ans;
  177. }
  178. }
  179.  
  180. // hash value of all string means hash[0..(n-1)] // 0 based indexing
  181. lli totalhash(string &s){
  182. return(prehash[sz(s)-1]%mod);
  183. }
  184. };
  185.  
  186.  
  187.  
  188. bool check(string &a , string &b , Hash &obja , Hash &objb , lli len)
  189. {
  190. unordered_set<lli> st;
  191. for(lli i=0;i<=sz(a)-len;i++)
  192. st.insert(obja.gethash(i,i+len-1));
  193.  
  194. for(lli i=0;i<=sz(b)-len;i++)
  195. {
  196. if(st.find(objb.gethash(i,i+len-1)) != st.end())
  197. return true;
  198. }
  199. return false;
  200.  
  201. }
  202.  
  203.  
  204. int main(){
  205. fastio
  206. lli t=1;
  207. //cin>>t;
  208. init(53);
  209. while(t--) {
  210. string aa,bb,a,b;
  211. cin>>aa>>bb;
  212. if(sz(aa)>sz(bb))
  213. {
  214. a=aa;
  215. b=bb;
  216. }
  217. else
  218. {
  219. a=bb;
  220. b=aa;
  221. }
  222. Hash obja , objb;
  223. obja.precomputehash(a);
  224. objb.precomputehash(b);
  225.  
  226. lli ans = 0;
  227. lli l = 0;
  228. lli r = sz(b);
  229. while(l<=r)
  230. {
  231. lli mid = (l+r)/2;
  232. if(check(a,b,obja,objb,mid))
  233. {
  234. l = mid+1;
  235. ans = mid;
  236. }
  237. else
  238. {
  239. r = mid-1;
  240. }
  241. }
  242. print(ans);
  243.  
  244. }
  245. return 0;
  246. }
Success #stdin #stdout 0.01s 19064KB
stdin
~~~vv~-~~vv~v-v--~-^-~^~-^^
~^~--v~-
stdout
4