#include #include #include #include #pragma GCC target("avx2") #pragma GCC optimize("O3,unroll-loops") #include using namespace std; #define INF 1e9 int minfunc(int *arr, int n) { int ans = INF; int i = 0; __m256i rans = _mm256_set1_epi32(INF); for (; (uintptr_t)&arr[i] % 32; ++i) ans = min(ans, arr[i]); for (; i + 24 <= n; i += 24) { __m256i ra0 = _mm256_load_si256((__m256i*)&arr[i]); __m256i ra8 = _mm256_load_si256((__m256i*)&arr[i + 8]); __m256i ra16 = _mm256_load_si256((__m256i*)&arr[i + 16]); __m256i rm08 = _mm256_min_epi32(ra0, ra8); rans = _mm256_min_epi32(rans, ra16); rans = _mm256_min_epi32(rans, rm08); // rans = _mm256_min_epi32(rans, ra0); // rans = _mm256_min_epi32(rans, ra8); // rans = _mm256_min_epi32(rans, ra16); } int res[8]; _mm256_storeu_si256((__m256i*)res, rans); ans = min(ans, res[0]); ans = min(ans, res[1]); ans = min(ans, res[2]); ans = min(ans, res[3]); ans = min(ans, res[4]); ans = min(ans, res[5]); ans = min(ans, res[6]); ans = min(ans, res[7]); for (; i < n; ++i) ans = min(ans, arr[i]); return ans; } bool iseq(char* s, char* t, int n) { int i = 0; __m256i rans = _mm256_set1_epi32(-1); for (; i + 32 <= n; i += 32) { __m256i rs = _mm256_lddqu_si256((__m256i*)&s[i]); __m256i rt = _mm256_lddqu_si256((__m256i*)&t[i]); __m256i rmask = _mm256_cmpeq_epi8(rs, rt); rans = _mm256_and_si256(rans, rmask); } long long res[4]; _mm256_storeu_si256((__m256i*)res, rans); if ((res[0] & res[1] & res[2] & res[3]) != -1LL) return false; for (; i < n; ++i) if (s[i] != t[i]) return false; // return memcmp(&s[i], &t[i], n - i) == 0; return true; } bool iseq2(char* s, char* t, int n) { int i = 0; __m256i r1 = _mm256_set1_epi32(-1); for (; i + 32 <= n; i += 32) { __m256i rs = _mm256_lddqu_si256((__m256i*)&s[i]); __m256i rt = _mm256_lddqu_si256((__m256i*)&t[i]); __m256i rmask = _mm256_cmpeq_epi8(rs, rt); if (_mm256_testc_si256(rmask, r1) == 0) return false; } for (; i < n; ++i) if (s[i] != t[i]) return false; // return memcmp(&s[i], &t[i], n - i) == 0; return true; } void change3(int *arr, int n, int k, int x) { int i = 0; __m256i rk = _mm256_set1_epi32(k); __m256i rx = _mm256_set1_epi32(x); for (; i + 8 <= n; i += 8) { __m256i ra = _mm256_lddqu_si256((__m256i*)&arr[i]); __m256i rmask = _mm256_cmpgt_epi32(ra, rk); ra = _mm256_or_si256( _mm256_and_si256(rmask, rx), _mm256_andnot_si256(rmask, ra) ); _mm256_storeu_si256((__m256i*)&arr[i], ra); } for (; i < n; ++i) if (arr[i] > k) arr[i] = x; } int main() { vector arr = {4, 1, 2,3, 4, 6, 7, 2, 4, 687, 8, -10, 9, 123, 4123, 123, 5432, 123, 532, 123}; cout << minfunc(&arr[0], arr.size()) << "\n"; string s(100, 'a'); string t(100, 'a'); t[40] = 'r'; cout << iseq(&s[0], &t[0], s.size()) << "\n"; }