大连现场赛B题

来源:互联网 发布:淘宝摇杆 编辑:程序博客网 时间:2024/04/27 21:45
虽然没看懂,但是记录下我悲伤的几个星期,虽然看懂了shift_and算法,但是这个映射是什么鬼
#include <iostream>#include <cstdio>
#include<cstring>#define MAX_N 1005#define MAX_LEN 10000005#define MAX_ARR_LEN ((MAX_N >> 6) + 5)#define MASK 63using namespace std;typedef unsigned long long myint;myint num[10][MAX_ARR_LEN];myint ret_n[MAX_ARR_LEN];myint ind_x_arr[MAX_N];myint ind_y_arr[MAX_N];char str[MAX_LEN];void init(myint n){    memset(num, 0, sizeof(num));    memset(ret_n, 0, sizeof(ret_n));    for (myint i = 0; i < n; i++)    {        ind_x_arr[i] = (i >> 6) + 1;        ind_y_arr[i] = ((myint)1 << (i & MASK));        //printf("ind_x_arr[%llu]=%llu\n",i,ind_x_arr[i]);        //printf("ind_y_arr[%llu]=%llu\n",i,ind_y_arr[i]);    }}inline void set_one(myint *arr, myint n){    arr[ind_x_arr[n]] |= ind_y_arr[n];}inline bool seek_one(myint *arr, myint n){    return arr[ind_x_arr[n]] & ind_y_arr[n];}inline void left_move_one(myint *arr, myint n){    for (myint i = n; i >= 1; i--)    {        arr[i] <<= 1;        arr[i] |= (!!(arr[i - 1] & 0x8000000000000000LL));    }    set_one(arr, 0);}inline void and_opt(myint *arr1, myint *arr2, myint n){    for (myint i = 1; i<= n; i++)    {        arr1[i] &= arr2[i];    }}int main(){    myint n, ai, bi, len, l;    char ch;    scanf("%llu", &n);    init(n);    for (myint i = 0; i < n; i++)    {        scanf("%llu", &ai);        for (myint j = 0; j < ai; j++)        {            scanf("%llu", &bi);            set_one(num[bi], i);        }    }    scanf("%s", str);    len = strlen(str);    l = (n >> 6) + (!!(n & MASK));    for (myint i = 0; i < len; i++)    {        left_move_one(ret_n, l);        and_opt(ret_n, num[str[i] - '0'], l);        if (seek_one(ret_n, n - 1))        {            ch = str[i + 1];            str[i + 1] = '\0';            printf("%s\n", str + i - n + 1);            str[i + 1] = ch;        }    }    return 0;}

0 0
原创粉丝点击