Advertisement
Guest User

Benchmark

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