fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long int
  3. #define inf 1e18
  4. #define iosbase ios_base::sync_with_stdio(false);
  5. #define mp make_pair
  6. #define pb push_back
  7. #define MOD 1000000007
  8. #define sc(n) scanf("%lld" , &n);
  9. #define Max 500005
  10. using namespace std;
  11.  
  12. typedef vector<ll> VI;
  13. VI v1 , v2;
  14. ll A[Max], B[Max], C[Max];
  15. ll Z[Max];
  16.  
  17. void clearZ(){
  18. for(int i=0 ; i<Max ; i++)Z[i]=0;
  19. }
  20.  
  21.  
  22. void calculateZ(ll * arr , ll n)
  23. {
  24. int L = 0, R = 0;
  25. for (int i = 1; i < n; i++){
  26. if (i > R){
  27.  
  28. L = R = i;
  29. while (R < n && arr[R-L] == arr[R]) R++;
  30. Z[i] = R-L; R--;
  31. }
  32. else{
  33.  
  34. int k = i-L;
  35. if (Z[k] < R-i+1) Z[i] = Z[k];
  36. else{
  37. L = i;
  38. while (R < n && arr[R-L] == arr[R]) R++;
  39. Z[i] = R-L; R--;
  40. }
  41. }
  42. }
  43. }
  44.  
  45. void calcZ(ll * A , ll * B , ll size1 , ll size2 , ll first){
  46.  
  47. ll size = size1+size2+1;
  48. ll arr[size];
  49. int i;
  50. for(i=0 ; i<size2 ; i++){
  51. arr[i]=B[i];
  52. }
  53. arr[i++]=-1;
  54. for(int j=0;j<size1 ; j++)
  55. {
  56. arr[i++]=A[j];
  57. }
  58.  
  59. //calculating the Z part
  60. clearZ();
  61. calculateZ(arr , size);
  62.  
  63. for (int i = 0; i < size; ++i)
  64. {
  65. if (Z[i] == size2)
  66. {
  67. if(first){
  68. v1.pb(i-size2-1);
  69. }
  70. else{
  71. v2.pb(i-size2-1);
  72. }
  73. }
  74. }
  75.  
  76.  
  77. }
  78.  
  79.  
  80. int main()
  81. {
  82. iosbase
  83. ll N,K,L;
  84. cin>>N>>K>>L;
  85. for(int i=0 ; i<N ; i++){
  86. cin>>A[i];
  87. }
  88. for(int i=0 ; i<K ; i++){
  89. cin>>B[i];
  90. }
  91. for(int i=0 ; i<L ; i++){
  92. cin>>C[i];
  93. }
  94.  
  95. calcZ(A,C,N,L,1);
  96. calcZ(A,B,N,K,0);
  97.  
  98. ll ans=0;
  99.  
  100. for(int i=0 ; i<v1.size() ; i++)
  101. {
  102. ll val = v1[i];
  103. VI::iterator it;
  104.  
  105. it = lower_bound(v2.begin() , v2.end() , val);
  106. ll ind = it-v2.begin();
  107.  
  108. if(ind == 0 && v2[0] >= v1[i])
  109. {
  110. ans += (v2.size() - ind);
  111. }
  112. else
  113. {
  114. ans += (v2.size() - ind);
  115. }
  116. }
  117. cout<<ans<<endl;
  118.  
  119.  
  120. return 0;
  121. }
Time limit exceeded #stdin #stdout 5s 19080KB
stdin
Standard input is empty
stdout
Standard output is empty