Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //大概是原始版本吧,我忘了我改过没有
- #include<bits/stdc++.h>
- #pragma GCC optimize("Ofast")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,abm,mmx,avx,avx2")
- #pragma GCC optimize("unroll-loops")
- using namespace std;
- typedef unsigned long long u64_t;
- typedef unsigned char u16_t;
- const char skillNameMap[][13] = {
- "火球术", "冰冻术", "雷击术", "地裂术", "吸血攻击", "投毒", "连击",
- "会心一击", "瘟疫", "生命之轮", "狂暴术", "魅惑", "加速术", "减速术",
- "诅咒", "治愈魔法", "苏生术", "净化", "铁壁", "蓄力", "聚气",
- "潜行", "血祭", "分身", "幻术", "防御", "守护", "伤害反弹",
- "护身符", "护盾", "反击", "吞噬", "召唤亡灵", "垂死抗争", "隐匿",
- "啧", "啧", "啧", "啧", "啧"};
- const int N = 256, M = 128, K = 64, skill_cnt = 40;
- int V;
- struct Name {
- u16_t val_base[N];
- u16_t val[N], name_base[M], freq[16], skill[skill_cnt], p, q;
- int q_len;
- inline u16_t m() {
- q += val[++ p];
- swap(val[p], val[q]);
- return val[val[p] + val[q] & 255];
- }
- inline int gen() {
- int u = m();
- return (u << 8 | m()) % skill_cnt;
- }
- void load_team(const char *team) {
- int t_len = strlen(team) + 1;
- u16_t s;
- for (int i = 0; i < N; i++) val_base[i] = i;
- for (int i = s = 0; i < N; ++i) {
- if (i % t_len) s += team[i % t_len - 1];
- s += val_base[i];
- swap(val_base[i], val_base[s]);
- }
- }
- void load_name(const char *name) {
- q_len = -1;
- memcpy(val, val_base, sizeof val);
- u16_t s;
- for (int _ = 0; _ < 2; _ ++)
- for (int i = s = 0; i < N; i ++) {
- if (i & 15) s += name[(i & 15) - 1];
- s += val[i];
- swap(val[i], val[s]);
- }
- for (int i = 0; i < N; i += 8) {
- val[i] = val[i] * 181 + 160;
- val[i + 1] = val[i + 1] * 181 + 160;
- val[i + 2] = val[i + 2] * 181 + 160;
- val[i + 3] = val[i + 3] * 181 + 160;
- val[i + 4] = val[i + 4] * 181 + 160;
- val[i + 5] = val[i + 5] * 181 + 160;
- val[i + 6] = val[i + 6] * 181 + 160;
- val[i + 7] = val[i + 7] * 181 + 160;
- }
- for (int i = 0; i < N; i ++)
- if (val[i] >= 89 && val[i] < 217)
- name_base[++q_len] = val[i] & 63;
- }
- void calc_props(int *props, u16_t (Name::*info)[M]) {
- u16_t r[10], *a = this->*info;
- int p_cnt = 0;
- for (u16_t *p = a + 10, *q = a + 31; p < q; p += 3)
- props[p_cnt++] =
- max(min(*p, *(p + 1)),
- min(max(*p, *(p + 1)), *(p + 2))); // 中位数
- V = 0;
- for (int i = 0; i < 7; i ++)
- V += props[i];
- if (V <= 307) {
- props[7] = 0;
- return ;
- }
- memcpy(r, a, 10 * sizeof(u16_t));
- sort(r, r + 10);
- props[p_cnt] = 154 + r[3] + r[4] + r[5] + r[6];
- }
- void calc_skills(const char *name) {
- memcpy(val, val_base, sizeof val);
- u16_t s;
- for (int _ = 0; _ < 2; _ ++)
- for (int i = s = 0; i < N; i ++) {
- if (i & 15) s += name[(i & 15) - 1];
- s += val[i];
- swap(val[i], val[s]);
- }
- u16_t *a = name_base + K;
- for (int i = 0; i < skill_cnt; i++) skill[i] = i;
- memset(freq, 0, sizeof freq);
- p = q = 0;
- for (int s = 0, _ = 0; _ < 2; _ ++)
- for (int i = 0; i < skill_cnt; i ++) {
- s = (s + gen() + skill[i]) % skill_cnt;
- swap(skill[i], skill[s]);
- }
- int last = -1;
- for (int i = 0, j = 0; i < K; i += 4, j ++) {
- u16_t p = min({a[i], a[i + 1], a[i + 2], a[i + 3]});
- if (p > 10 && skill[j] < 35) {
- freq[j] = p - 10;
- if (skill[j] < 25) last = j;
- }
- }
- if (last != -1) freq[last] <<= 1;
- if (freq[14] && last != 14)
- freq[14] += min({name_base[60], name_base[61], freq[14]});
- if (freq[15] && last != 15)
- freq[15] += min({name_base[62], name_base[63], freq[15]});
- }
- };
- char team[N], tmp[N], prefix[N], fname[N];
- int n, prop[8], jyztxdy, jyzyyds, tp;
- long long l, r;
- u16_t idx[16];
- Name name;
- void read(char *p) {
- while ((*p = getchar()) == '\n');
- while ((*++p = getchar()) != '\n');
- *p = 0;
- }
- int main() {
- puts("输入战队名:");
- read(team);
- name.load_team(team);
- puts("输入前缀(前缀为空则输入$):");
- read(tmp);
- jyzyyds = strlen(tmp);
- if (tmp[0] == '$') jyzyyds = 0;
- puts("选择测号模式:\n1. 顺序数字和字母\n2. 顺序数字\n3. 顺序大写字母\n4. 随机数字和大写字母");
- mt19937_64 rnd(time(0));
- cin >> tp;
- if (jyzyyds > 7 && tp == 1 || jyzyyds > 3 && tp == 2 || jyzyyds > 6 && tp == 3 || jyzyyds > 5 && tp == 4) {
- puts("可以换一个更短一点的前缀吗qwq");
- return 0;
- }
- #if DEBUG
- l = 50000000000ll;
- r = 100000000000ll;
- fname[0] = '0';
- #else
- puts("输入区间(l,r]:");
- cin >> l >> r;
- puts("输出文件:");
- read(fname);
- #endif
- FILE *fp = fopen(fname, "w");
- if (!fp) return fputs("文件打开失败", stderr), 0;
- clock_t start = clock();
- if (tp != 4) {
- if (tp != 3) for (int i = 14; i >= jyzyyds; i --) tmp[i] = '0';
- if (tp == 3) for (int i = 14; i >= jyzyyds; i --) tmp[i] = 'A';
- u16_t tmpp[15];
- long long l1 = l;
- if (tp == 1)
- for (int i = 14; i >= 0; i --)
- tmpp[i] = l1 % 62,l1 /= 62;
- if (tp == 2)
- for (int i = 14; i >= 0; i --)
- tmpp[i] = l1 % 10,l1 /= 10;
- if (tp == 3)
- for (int i = 14; i >= 0; i --)
- tmpp[i] = l1 % 26,l1 /= 26;
- for (int pos = jyzyyds; pos < 15 ; pos++)
- for (int _ = 0; _ < tmpp[pos]; _ ++ ) {
- tmp[pos] ++;
- if (tp == 1) {
- if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
- if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
- }
- }
- }
- for (u64_t i = l, j = 1, k = 0; i < r; i ++, j ++) {
- if (tp != 4) {
- int pos = 14;
- tmp[pos] ++;
- if (tp == 1) {
- if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
- if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
- }
- while (tp == 1 && tmp[pos] == 'z' + 1 || tp == 2 && tmp[pos] == '9' + 1 || tp == 3 && tmp[pos] == 'Z' + 1) {
- tmp[pos] = tp != 3 ? '0' : 'A';
- -- pos;
- tmp[pos] ++;
- if (tp == 1) {
- if (tmp[pos] == '9' + 1) tmp[pos] = 'A';
- if (tmp[pos] == 'Z' + 1) tmp[pos] = 'a';
- }
- }
- }
- if (tp == 4) for (int pos = jyzyyds; pos < 15 ; pos++) {
- tmp[pos] = rnd() % 36;
- if (tmp[pos] < 10) tmp[pos] = '0' + tmp[pos];
- else tmp[pos] = 'A' + tmp[pos] - 10;
- }
- name.load_name(tmp);
- name.calc_props(prop, &Name::name_base);
- if (V * 3 + prop[7] >= 1320) { // 三表
- name.calc_skills(tmp);
- for (int j = 0; j < 7; j ++) prop[j] += 36;
- bool flag = 0,flag2 = 0;
- int sum = V + 36 * 7 + prop[7] / 3, sum2 = 0;
- for (int _ = 0; _ < 16; _ ++) sum2 += name.freq[_];
- // sum: 八围 ; sum2: 技能熟练度总和 ; name.freq: 每项技能熟练度
- if (sum >= 712) flag = 1; // 八围达到四表标准
- if (prop[4] <= 55 || sum >= 707 && prop[4] <= 60) flag = 1; // 魔低号
- if (sum - prop[0] >= 645
- && prop[4] >= 85 && prop[6] >= 85)
- flag = 1; // 攻低号, 要求 魔/智 都不能低
- for (int _ = 0; _ < 16; _ ++) {
- if (name.freq[_] >= 80)
- flag = flag2 = 1; // 单项技能超高号
- if (name.skill[_] == 21) // 背刺
- if (prop[0] + prop[4] + 10 < prop[1] + prop[5]
- && name.freq[_] > 50)
- flag = flag2 = 1;
- // 熟练度 > 50 且 攻击属性 < 防御属性
- if (name.skill[_] == 17) // 净化
- if (name.freq[_] > 65)
- flag = flag2 = 1; // 熟练度 > 65
- }
- if (sum2 >= 160) flag = 1; // 技能总熟练度 >= 160
- if (sum2 <= 120 && !flag2 && sum <= 722) flag = 0; // 去除技能较少且没有单项好技能的低八围号
- if (sum2 <= 100 && !flag2 && sum <= 732) flag = 0; // 去除技能很少且没有单项好技能的中低八围号
- if (flag) {
- fprintf(fp, "%s@%s\n", tmp, team);
- fflush(fp);
- }
- }
- if (j == 2e6) {
- j -= 2e6;
- k += 2;
- clock_t end = clock();
- double tm = 1.0 * (end - start) / CLOCKS_PER_SEC;
- fprintf(stderr, "count: %lluk, time: %.2fs, speed: %.0fk/d.\n"
- , k * 1000, tm, k * 1e3 / tm * 86400);
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment