Theory_of_Everything

generoter

Apr 25th, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.20 KB | None | 0 0
  1. //大概是原始版本吧,我忘了我改过没有
  2.  
  3.  
  4. #include<bits/stdc++.h>
  5. #pragma GCC optimize("Ofast")
  6. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,abm,mmx,avx,avx2")
  7. #pragma GCC optimize("unroll-loops")
  8. using namespace std;
  9. typedef unsigned long long u64_t;
  10. typedef unsigned char u16_t;
  11. const char skillNameMap[][13] = {
  12.     "火球术",    "冰冻术",    "雷击术",    "地裂术", "吸血攻击", "投毒",    "连击",
  13.     "会心一击", "瘟疫",       "生命之轮", "狂暴术", "魅惑",    "加速术",    "减速术",
  14.     "诅咒",       "治愈魔法", "苏生术",    "净化",     "铁壁",   "蓄力",   "聚气",
  15.     "潜行",       "血祭",       "分身",       "幻术",     "防御",   "守护",   "伤害反弹",
  16.     "护身符",    "护盾",       "反击",       "吞噬",     "召唤亡灵", "垂死抗争", "隐匿",
  17.     "啧",      "啧",      "啧",      "啧",    "啧"};
  18. const int N = 256, M = 128, K = 64, skill_cnt = 40;
  19. int V;
  20. struct Name {
  21.     u16_t val_base[N];
  22.     u16_t val[N], name_base[M], freq[16], skill[skill_cnt], p, q;
  23.     int q_len;
  24.     inline u16_t m() {
  25.         q += val[++ p];
  26.         swap(val[p], val[q]);
  27.         return val[val[p] + val[q] & 255];
  28.     }
  29.     inline int gen() {
  30.         int u = m();
  31.         return (u << 8 | m()) % skill_cnt;
  32.     }
  33.     void load_team(const char *team) {
  34.         int t_len = strlen(team) + 1;
  35.         u16_t s;
  36.         for (int i = 0; i < N; i++) val_base[i] = i;
  37.         for (int i = s = 0; i < N; ++i) {
  38.             if (i % t_len) s += team[i % t_len - 1];
  39.             s += val_base[i];
  40.             swap(val_base[i], val_base[s]);
  41.         }
  42.     }
  43.     void load_name(const char *name) {
  44.         q_len = -1;
  45.         memcpy(val, val_base, sizeof val);
  46.         u16_t s;
  47.         for (int _ = 0; _ < 2; _ ++)
  48.             for (int i = s = 0; i < N; i ++) {
  49.                 if (i & 15) s += name[(i & 15) - 1];
  50.                 s += val[i];
  51.                 swap(val[i], val[s]);
  52.             }
  53.         for (int i = 0; i < N; i += 8) {
  54.             val[i] = val[i] * 181 + 160;
  55.             val[i + 1] = val[i + 1] * 181 + 160;
  56.             val[i + 2] = val[i + 2] * 181 + 160;
  57.             val[i + 3] = val[i + 3] * 181 + 160;
  58.             val[i + 4] = val[i + 4] * 181 + 160;
  59.             val[i + 5] = val[i + 5] * 181 + 160;
  60.             val[i + 6] = val[i + 6] * 181 + 160;
  61.             val[i + 7] = val[i + 7] * 181 + 160;
  62.         }
  63.         for (int i = 0; i < N; i ++)
  64.             if (val[i] >= 89 && val[i] < 217)
  65.                 name_base[++q_len] = val[i] & 63;
  66.     }
  67.     void calc_props(int *props, u16_t (Name::*info)[M]) {
  68.         u16_t r[10], *a = this->*info;
  69.         int p_cnt = 0;
  70.         for (u16_t *p = a + 10, *q = a + 31; p < q; p += 3)
  71.             props[p_cnt++] =
  72.                 max(min(*p, *(p + 1)),
  73.                     min(max(*p, *(p + 1)), *(p + 2))); // 中位数
  74.         V = 0;
  75.         for (int i = 0; i < 7; i ++)
  76.             V += props[i];
  77.         if (V <= 307) {
  78.             props[7] = 0;
  79.             return ;
  80.         }
  81.         memcpy(r, a, 10 * sizeof(u16_t));
  82.         sort(r, r + 10);
  83.         props[p_cnt] = 154 + r[3] + r[4] + r[5] + r[6];
  84.     }
  85.     void calc_skills(const char *name) {
  86.         memcpy(val, val_base, sizeof val);
  87.         u16_t s;
  88.         for (int _ = 0; _ < 2; _ ++)
  89.             for (int i = s = 0; i < N; i ++) {
  90.                 if (i & 15) s += name[(i & 15) - 1];
  91.                 s += val[i];
  92.                 swap(val[i], val[s]);
  93.             }
  94.         u16_t *a = name_base + K;
  95.         for (int i = 0; i < skill_cnt; i++) skill[i] = i;
  96.         memset(freq, 0, sizeof freq);
  97.         p = q = 0;
  98.         for (int s = 0, _ = 0; _ < 2; _ ++)
  99.             for (int i = 0; i < skill_cnt; i ++) {
  100.                 s = (s + gen() + skill[i]) % skill_cnt;
  101.                 swap(skill[i], skill[s]);
  102.             }
  103.         int last = -1;
  104.         for (int i = 0, j = 0; i < K; i += 4, j ++) {
  105.             u16_t p = min({a[i], a[i + 1], a[i + 2], a[i + 3]});
  106.             if (p > 10 && skill[j] < 35) {
  107.                 freq[j] = p - 10;
  108.                 if (skill[j] < 25) last = j;
  109.             }
  110.         }
  111.         if (last != -1) freq[last] <<= 1;
  112.         if (freq[14] && last != 14)
  113.             freq[14] += min({name_base[60], name_base[61], freq[14]});
  114.         if (freq[15] && last != 15)
  115.             freq[15] += min({name_base[62], name_base[63], freq[15]});
  116.     }
  117. };
  118. char team[N], tmp[N], prefix[N], fname[N];
  119. int n, prop[8], jyztxdy, jyzyyds, tp;
  120. long long l, r;
  121. u16_t idx[16];
  122. Name name;
  123. void read(char *p) {
  124.     while ((*p = getchar()) == '\n');
  125.     while ((*++p = getchar()) != '\n');
  126.     *p = 0;
  127. }
  128. int main() {
  129.     puts("输入战队名:");
  130.     read(team);
  131.     name.load_team(team);
  132.     puts("输入前缀(前缀为空则输入$):");
  133.     read(tmp);
  134.     jyzyyds = strlen(tmp);
  135.     if (tmp[0] == '$') jyzyyds = 0;
  136.     puts("选择测号模式:\n1. 顺序数字和字母\n2. 顺序数字\n3. 顺序大写字母\n4. 随机数字和大写字母");
  137.     mt19937_64 rnd(time(0));
  138.     cin >> tp;
  139.     if (jyzyyds > 7 && tp == 1 || jyzyyds > 3 && tp == 2 || jyzyyds > 6 && tp == 3 || jyzyyds > 5 && tp == 4) {
  140.         puts("可以换一个更短一点的前缀吗qwq");
  141.         return 0;
  142.     }
  143.     #if DEBUG
  144.         l = 50000000000ll;
  145.         r = 100000000000ll;
  146.         fname[0] = '0';
  147.     #else
  148.         puts("输入区间(l,r]:");
  149.         cin >> l >> r;
  150.         puts("输出文件:");
  151.         read(fname);
  152.     #endif
  153.     FILE *fp = fopen(fname, "w");
  154.     if (!fp) return fputs("文件打开失败", stderr), 0;
  155.     clock_t start = clock();
  156.     if (tp != 4) {
  157.         if (tp != 3) for (int i = 14; i >= jyzyyds; i --) tmp[i] = '0';
  158.         if (tp == 3) for (int i = 14; i >= jyzyyds; i --) tmp[i] = 'A';
  159.         u16_t tmpp[15];
  160.         long long l1 = l;
  161.         if (tp == 1)
  162.             for (int i = 14; i >= 0; i --)
  163.                 tmpp[i] = l1 % 62,l1 /= 62;
  164.         if (tp == 2)
  165.             for (int i = 14; i >= 0; i --)
  166.                 tmpp[i] = l1 % 10,l1 /= 10;
  167.         if (tp == 3)
  168.             for (int i = 14; i >= 0; i --)
  169.                 tmpp[i] = l1 % 26,l1 /= 26;
  170.         for (int pos = jyzyyds; pos < 15 ; pos++)
  171.             for (int _ = 0; _ < tmpp[pos]; _ ++ ) {
  172.                 tmp[pos] ++;
  173.                 if (tp == 1) {
  174.                     if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
  175.                     if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
  176.                 }
  177.         }
  178.     }
  179.     for (u64_t i = l, j = 1, k = 0; i < r; i ++, j ++) {
  180.         if (tp != 4) {
  181.             int pos = 14;
  182.             tmp[pos] ++;
  183.             if (tp == 1) {
  184.                 if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
  185.                 if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
  186.             }
  187.             while (tp == 1 && tmp[pos] == 'z' + 1 || tp == 2 && tmp[pos] == '9' + 1 || tp == 3 && tmp[pos] == 'Z' + 1) {
  188.                 tmp[pos] = tp != 3 ? '0' : 'A';
  189.                 -- pos;
  190.                 tmp[pos] ++;
  191.                 if (tp == 1) {
  192.                     if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
  193.                     if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
  194.                 }
  195.             }
  196.         }
  197.         if (tp == 4) for (int pos = jyzyyds; pos < 15 ; pos++) {
  198.             tmp[pos] = rnd() % 36;
  199.             if (tmp[pos] < 10) tmp[pos] = '0' + tmp[pos];
  200.             else tmp[pos] = 'A' + tmp[pos] - 10;
  201.         }
  202.         name.load_name(tmp);
  203.         name.calc_props(prop, &Name::name_base);
  204.         if (V * 3 + prop[7] >= 1320) { // 三表
  205.             name.calc_skills(tmp);
  206.             for (int j = 0; j < 7; j ++) prop[j] += 36;
  207.             bool flag = 0,flag2 = 0;
  208.             int sum = V + 36 * 7 + prop[7] / 3, sum2 = 0;
  209.             for (int _ = 0; _ < 16; _ ++) sum2 += name.freq[_];
  210.                 // sum: 八围 ; sum2: 技能熟练度总和 ; name.freq: 每项技能熟练度
  211.             if (sum >= 712) flag = 1; // 八围达到四表标准
  212.             if (prop[4] <= 55 || sum >= 707 && prop[4] <= 60) flag = 1; // 魔低号
  213.             if (sum - prop[0] >= 645
  214.                 && prop[4] >= 85 && prop[6] >= 85)
  215.                     flag = 1; // 攻低号, 要求 魔/智 都不能低
  216.             for (int _ = 0; _ < 16; _ ++) {
  217.                 if (name.freq[_] >= 80)
  218.                     flag = flag2 = 1; // 单项技能超高号
  219.                 if (name.skill[_] == 21) // 背刺
  220.                     if (prop[0] + prop[4] + 10 < prop[1] + prop[5]
  221.                         && name.freq[_] > 50)
  222.                             flag = flag2 = 1;
  223.                                 // 熟练度 > 50 且 攻击属性 < 防御属性
  224.                 if (name.skill[_] == 17) // 净化
  225.                     if (name.freq[_] > 65)
  226.                         flag = flag2 = 1; // 熟练度 > 65
  227.             }
  228.             if (sum2 >= 160) flag = 1; // 技能总熟练度 >= 160
  229.             if (sum2 <= 120 && !flag2 && sum <= 722) flag = 0; // 去除技能较少且没有单项好技能的低八围号
  230.             if (sum2 <= 100 && !flag2 && sum <= 732) flag = 0; // 去除技能很少且没有单项好技能的中低八围号
  231.             if (flag) {
  232.                 fprintf(fp, "%s@%s\n", tmp, team);
  233.                 fflush(fp);
  234.             }
  235.         }
  236.         if (j == 2e6) {
  237.             j -= 2e6;
  238.             k += 2;
  239.             clock_t end = clock();
  240.             double tm = 1.0 * (end - start) / CLOCKS_PER_SEC;
  241.             fprintf(stderr, "count: %lluk, time: %.2fs, speed: %.0fk/d.\n"
  242.                 , k * 1000, tm, k * 1e3 / tm * 86400);
  243.         }
  244.     }
  245.     return 0;
  246. }
  247.  
Add Comment
Please, Sign In to add comment