Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstring> // strlen
- #include <algorithm> // mismatch
- #include <cassert> // assert
- #include <cstddef> // ptrdiff_t
- #include <iterator> // distance
- std::ptrdiff_t len_common_prefix_base(char const a[], char const b[])
- {
- assert(std::strlen(b) <= std::strlen(a));
- return std::distance(b, std::mismatch(b, b + std::strlen(b), a).first);
- }
- std::ptrdiff_t len_common_prefix_10x(char const a[], char const b[])
- {
- assert(std::strlen(b) <= std::strlen(a));
- using block_type = long long int;
- auto p = reinterpret_cast<block_type const*>(a);
- auto q = reinterpret_cast<block_type const*>(b);
- auto const n = std::strlen(b);
- auto const num_blocks = n / sizeof(block_type);
- auto block_mismatch = std::mismatch(q, q + num_blocks, p);
- auto b2 = reinterpret_cast<char const*>(block_mismatch.first);
- auto a2 = reinterpret_cast<char const*>(block_mismatch.second);
- return std::distance(b, std::mismatch(b2, b + n, a2).first);
- }
- long long int len_common_prefix(char a[], char b[]) {
- long long int* p = (long long int*)a;
- long long int* q = (long long int*)b;
- int ratio = sizeof(long long int) / sizeof(char);
- while (*p == *q) {
- p++;
- q++;
- }
- long long long_long_diff = p-(long long int*)a;
- char* p2 = (char*)p;
- char* q2 = (char*)q;
- while (*p2 == *q2) {
- p2++;
- q2++;
- }
- return long_long_diff * ratio + (p2 - (char*)p);
- }
- long long int stringSimilarity(char a[]) {
- long long l = strlen(a);
- long long int sum = l;
- long long int sum_red = 0;
- int ratio = sizeof(long long int) / sizeof(char);
- long long l_red = l / ratio;
- for (long long i = 1; i < l; i++) {
- sum += len_common_prefix(a, a +i);
- }
- return sum;
- }
- int main() {
- int t, i;
- scanf("%d",&t);
- char a[100001];
- for (i=0;i<t;i++) {
- scanf("%s",a);
- long long int res=stringSimilarity(a);
- printf("%lld\n",res);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement