Guest User

Benchmark 2

a guest
Sep 13th, 2015
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <cstring>      // strlen
  2. #include <algorithm>    // mismatch
  3. #include <cassert>      // assert
  4. #include <cstddef>      // ptrdiff_t
  5. #include <iterator>     // distance
  6.  
  7. std::ptrdiff_t len_common_prefix_base(char const a[], char const b[], long long b_len)
  8. {
  9.     return std::distance(b, std::mismatch(b, b + b_len, a).first);
  10. }
  11.  
  12. std::ptrdiff_t len_common_prefix_10x(char const a[], char const b[], long long b_len)
  13. {
  14.     using block_type = long long int;
  15.  
  16.     auto p = reinterpret_cast<block_type const*>(a);
  17.     auto q = reinterpret_cast<block_type const*>(b);
  18.  
  19.     auto const num_blocks = b_len / sizeof(block_type);
  20.  
  21.     auto block_mismatch = std::mismatch(q, q + num_blocks, p);
  22.     auto b2 = reinterpret_cast<char const*>(block_mismatch.first);
  23.     auto a2 = reinterpret_cast<char const*>(block_mismatch.second);
  24.  
  25.     return std::distance(b, std::mismatch(b2, b + b_len, a2).first);
  26. }
  27.  
  28. long long int len_common_prefix(char a[], char b[]) {  
  29.     long long int* p = (long long int*)a;
  30.     long long int* q = (long long int*)b;
  31.     int ratio = sizeof(long long int) / sizeof(char);
  32.     while (*p == *q) {
  33.         p++;
  34.         q++;
  35.     }
  36.     long long long_long_diff = p-(long long int*)a;
  37.     char* p2 = (char*)p;
  38.     char* q2 = (char*)q;
  39.     while (*p2 == *q2) {
  40.         p2++;
  41.         q2++;
  42.     }
  43.     return long_long_diff * ratio + (p2 - (char*)p);
  44. }
  45.  
  46. long long int stringSimilarity(char a[]) {
  47.     long long l = strlen(a);
  48.     long long int sum = l;
  49.     long long int sum_red = 0;
  50.     int ratio = sizeof(long long int) / sizeof(char);
  51.     long long l_red = l / ratio;
  52.     for (long long i = 1; i < l; i++) {
  53.       sum += len_common_prefix_10x(a, a + i, l-i);
  54.     }
  55.     return sum;
  56. }
  57.  
  58. int main() {
  59.   int t, i;
  60.   scanf("%d",&t);
  61.   char a[100001];
  62.   for (i=0;i<t;i++) {
  63.     scanf("%s",a);
  64.     long long int res=stringSimilarity(a);
  65.     printf("%lld\n",res);
  66.   }
  67.   return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment