Codeforces 1137B(kmp next數組構造)
阿新 • • 發佈:2019-04-13
使用 inf ase while next amp const i++ def
為了物盡其用,Next求出最多有哪部分能重復使用,然後重復使用就行了……
const int maxn = 5e5 + 5; char s[maxn], t[maxn]; int cnts0, cnts1, cntt0, cntt1; int Next[maxn]; int main() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> (s + 1) >> (t + 1); int lens = strlen(s + 1), lent = strlen(t + 1); for (int i = 1; i <= lens; i++) { if (s[i] == '1') cnts1++; else cnts0++; } Next[1] = 0; for (int i = 2, j = 0; i <= lent; i++) { while (j > 0 && t[i] != t[j + 1]) j = Next[j]; if (t[i] == t[j + 1]) j++; Next[i] = j; } for (int i = Next[lent] + 1; i <= lent; i++) { if (t[i] == '1') cntt1++; else cntt0++; } for (int i = 1; i <= lent; i++) { if (t[i] == '1' && cnts1) cout << 1, cnts1--; else if (t[i] == '0' && cnts0) cout << 0, cnts0--; } int k = min(cntt0 ? cnts0 / cntt0 : inf, cntt1 ? cnts1 / cntt1 : inf); while (k--) { for (int i = Next[lent] + 1; i <= lent; i++) { if (t[i] == '1') cout << 1, cnts1--; else cout << 0, cnts0--; } } while (cnts1--) cout << 1; while (cnts0--) cout << 0; return 0; }
Codeforces 1137B(kmp next數組構造)