# Cheat Code
## Lecture 08: Midterm
### 1. Palindromic Series
```
#include <bits/stdc++.h>
using namespace std;
int t;
bool isPalindromic(string check)
{
for (int i = 0; i < check.length() / 2; i++)
if (check[i] != check[check.length() - i - 1])
return false;
return true;
}
int main()
{
cin >> t;
while (t--)
{
string n;
int sum = 0;
cin >> n;
for (int i = 0; i < n.length(); i++)
sum += (n[i] - '0');
string palin = "";
for (int i = 0; i < sum / n.length(); i++)
palin += n;
for (int i = 0; i < sum % n.length(); i++)
palin += n[i];
if (isPalindromic(palin))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
```
### 2. The Sultan's Successors
```
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#define SIZE 8
using namespace std;
bool check(int queens[SIZE], int row, int col) {
for (int i = 0; i < row; i++) {
if (queens[i] == col) return false;
}
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (queens[i] == j) return false;
}
for (int i = row - 1, j = col + 1; j < SIZE && i >= 0; i--, j++) {
if (queens[i] == j) return false;
}
return true;
}
void NQueen (int chessboard[SIZE][SIZE], int queens[SIZE], int row, int &ans) {
if (row == SIZE) {
int sum = 0;
for (int i = 0; i < SIZE; ++i) {
sum += chessboard[i][queens[i]];
}
ans = max(ans, sum);
return;
}
for (int i = 0; i < SIZE; ++i) {
if (!check(queens, row, i)) continue;
queens[row] = i;
NQueen(chessboard, queens, row + 1, ans);
}
}
int main() {
int k;
cin >> k;
while (k-- > 0) {
int chessboard[SIZE][SIZE];
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
cin >> chessboard[i][j];
}
}
int ans = 0, queens[SIZE];
NQueen(chessboard, queens, 0, ans);
cout << setw(5) << ans << endl;
}
}
```
### 3. Oliver and the Game
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void dfs(vector<vector<int>> &graph, vector<int> &start_time, vector<int> &finish_time, int &t, int v)
{
start_time[v] = ++t;
for (int u : graph[v])
{
if (!start_time[u])
{
dfs(graph, start_time, finish_time, t, u);
}
}
finish_time[v] = ++t;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, q;
cin >> n;
vector<vector<int>> graph(n);
for (int a, b, i = 0; i < n - 1; i++)
{
cin >> a >> b;
a--;
b--;
graph[a].push_back(b);
graph[b].push_back(a);
}
int t = 0;
vector<int> start_time(n, 0);
vector<int> finish_time(n, 0);
dfs(graph, start_time, finish_time, t, 0);
cin >> q;
for (int s, a, b, i = 0; i < q; ++i)
{
cin >> s >> a >> b;
--a;
--b;
if (s == 1)
swap(a, b);
if (start_time[a] <= start_time[b] && finish_time[a] >= start_time[b])
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}
```
### 4. Polo the Penguin and the XOR
```
#include <bits/stdc++.h>
using namespace std;
void AddOneBits(vector<int>& q, int x) {
int j = 0;
while (x > 0) {
q[j] += (x & 1);
x >>= 1;
++j;
}
}
int64_t XorSum(vector<int>& q, int y, int r) {
int64_t res = 0;
for (int j = 0; j < 32; j++) {
if ((y & 1) == 0) {
res += (1LL << j) * q[j];
}
else {
res += (1LL << j) * (r - q[j]);
}
y >>= 1;
}
return res;
}
void Solve() {
int n;
cin >> n;
vector<int> a(n + 1);
a[0] = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> p(n + 1);
p[0] = 0;
for (int i = 1; i <= n; i++) {
p[i] = p[i - 1] ^ a[i];
}
int64_t ans = 0;
vector<int> q(32, 0);
for (int r = 1; r <= n; r++) {
AddOneBits(q, p[r - 1]);
ans += XorSum(q, p[r], r);
}
cout << ans << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
int t;
cin >> t;
for (int i = 0; i < t; i++) Solve();
return 0;
}
```
### 5. Examination Papers
```
#include <cstdio>
const int MOD = 1e9 + 7;
long long power(int n) {
if (n == 0) {
return 1;
}
long long temp = power(n / 2);
if (n % 2 == 0) {
return (temp * temp) % MOD;
}
else {
return (temp * temp * 2) % MOD;
}
}
int main() {
int test_case;
scanf("%d", &test_case);
while (test_case--) {
int n;
scanf("%d", &n);
printf("%lld\n", power(n) - 1);
}
return 0;
}
```
## Lecture 09: Hash Table
### 1. The Monk and Prateek
```
#include <bits/stdc++.h>
using namespace std;
#define fastIO cin.tie(0);ios_base::sync_with_stdio(0)
map<int,int> mp; // store <hash_value,number_of_frequency>
int SumOfDigit(int n){
int res = 0;
while(n > 0){
res += n%10;
n = n/10;
}
return res;
}
int HashFunc(int n){
return n^SumOfDigit(n);
}
int main(){
fastIO;
int n, num;
int nCollision = 0;
int MaxHashValue = -1;
int MinHashValueCollision = 1e9;
int MaxFrequency = -1;
cin >> n;
for(int i = 0 ; i < n;i++){
cin >> num;
int hash_value = HashFunc(num);
MaxHashValue = max(MaxHashValue,hash_value);
mp[hash_value]++;
}
map<int,int>::iterator it;
for(it=mp.begin(); it!=mp.end(); it++){
nCollision += it->second - 1;
MaxFrequency = max(MaxFrequency, it->second);
}
if(mp.size() == n){
cout << MaxHashValue <<" ";
} else{
for(it=mp.begin(); it!=mp.end(); it++){
if(it->second == MaxFrequency ){
MinHashValueCollision = min(it->first,MinHashValueCollision);
}
}
cout << MinHashValueCollision <<" ";
}
cout << nCollision;
return 0;
}
```
### 2. Suffix Equal Prefix
```
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const long long MOD = 1e9 + 7;
const int MAXN = 1e6 + 1;
unsigned long long f[MAXN];
unsigned long long mul[MAXN];
void polyHash(string keys) {
unsigned long long hashValue = 0;
int n = keys.size();
for (int i = 0; i < n; i++) {
hashValue = (keys[i] - 'a' + (26 * hashValue) % MOD) % MOD;
f[i + 1] = hashValue;
}
}
int main() {
//freopen("input.txt", "r", stdin);
ios::sync_with_stdio(false);
int test;
string s;
mul[0] = 1;
for (int i = 1; i < MAXN; i++)
mul[i] = (mul[i - 1] * 26) % MOD;
cin >> test;
for (int t = 1; t <= test; t++) {
cin >> s;
f[0] = 0;
int n = s.size();
polyHash(s);
int res = 0, len = 1;
while (len < n) {
if (f[len] == ((f[n] - (f[n - len] * mul[len]) % MOD) + MOD) % MOD)
res++;
len++;
}
cout << "Case " << t << ": " << res << "\n";
}
return 0;
}
```
### 3. Good Substrings
```
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main() {
string s, b;
int k;
cin >> s >> b >> k;
const int BASE = 29;
unordered_set<uint64_t> good_strings;
for (int i = 0; i < s.length(); ++i) {
uint64_t hash = 0;
for (int j = i, bad = 0; j >= 0; --j) {
hash = hash * BASE + s[j] - 'a' + 1;
bad += (b[s[j] - 'a'] == '0');
if (bad <= k) {
good_strings.insert(hash);
}
else {
break;
}
}
}
cout << good_strings.size();
}
```
### 4. Cipher
```
#include <bits/stdc++.h>
using namespace std;
string s;
int n, k;
vector <int> ans;
int main () {
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
cin >> n >> k;
cin >> s;
int c = 0;
for (int i = 0; i < n; i++) {
if (i >= k) {
c ^= ans[i - k];
}
int x = s[i] - '0';
ans.push_back(c ^ x);
c ^= ans.back();
}
for (int i = 0; i < n; i++) {
cout << ans[i];
}
return 0;
}
```
### 5. Camp schedule
```
#include <bits/stdc++.h>
using namespace std;
#define hash fwpqenofqwoipngq
const int BASE = 29;
const int MOD = 1e9 + 7;
const int maxn = 5e5 + 100;
string s, t, sb, st;
int n, m;
int cnt[2], cntNeed[2];
long long power[maxn], hash[maxn];
void CreateHash(string s){
power[0] = 1;
for (int i = 0; i < s.size(); i++){
hash[i + 1] = (hash[i] * BASE + s[i]) % MOD;
power[i + 1] = (power[i] * BASE) % MOD;
}
}
long long GetHash(int l, int r){
return ((hash[r] - (hash[l - 1] * power[r - l + 1]) % MOD + MOD) % MOD);
}
int main(){
getline(cin,s);
getline(cin,t);
n = s.size();
m = t.size();
for (int i = 0; i < n; i++){
cnt[s[i] - '0']++;
}
for (int i = 0; i < m; i++){
cnt[t[i] - '0']--;
}
if (cnt[0] < 0 || cnt[1] < 0){
cout << s;
return 0;
}
CreateHash(t);
int MaxPrefixDuplicate = 0;
for (int len = m - 1; len >= 0; len--){
if (GetHash(1, len) == GetHash(m - len + 1, m)) {
MaxPrefixDuplicate = len;
break;
}
}
for (int i = MaxPrefixDuplicate; i < m; i++){
cntNeed[t[i] - '0']++;
st.push_back(t[i]);
}
int mNeed = m - MaxPrefixDuplicate;
sb = t;
while (cnt[0] >= cntNeed[0] && cnt[1] >= cntNeed[1]){
cnt[0] -= cntNeed[0];
cnt[1] -= cntNeed[1];
for (int i = 0; i < mNeed; i++){
sb.push_back(st[i]);
}
}
for (int i = 0; i < cnt[0]; i++){
sb.push_back('0');
}
for (int i = 0; i < cnt[1]; i++){
sb.push_back('1');
}
cout << sb;
}
```
### 6. Watto and Mechanism
```
#include <iostream>
#include <string>
#include <vector>
#include <set>
/******* HASHING VARS ********/
const int A = 3;
const int MAX_POWER_OF_A = (int)(6e5); // max of 6e5 chars in whole input(input string & queries)
std::vector<long long> powers_of_A1(MAX_POWER_OF_A, 1);
std::vector<long long> powers_of_A2(MAX_POWER_OF_A, 1);
const long long MOD1 = (long long)(1e18 + 7);
const long long MOD2 = (long long)(1e18 + 9);
/******* PROBLEM VARS ********/
int num_init_strings, num_queries;
std::vector<std::pair<std::pair<long long, long long>, std::string>> queries;
std::set<std::pair<long long, long long>> init_strings_hashes;
/******* HASHING INITIALIZATION FUNCTIONS ********/
void populate_powers_of_A()
{
for (int i = 1; i < MAX_POWER_OF_A; i++)
{
powers_of_A1[i] = (powers_of_A1[i - 1] * A) % MOD1;
powers_of_A2[i] = (powers_of_A2[i - 1] * A) % MOD2;
}
}
/******* INITIALIZATION FUNCTIONS ********/
void clear_init_strings_hash()
{
init_strings_hashes.clear();
}
void clear_queries()
{
queries.clear();
}
std::pair<long long, long long> polynomial_hash_string(std::string &s)
{
long long hash1 = 0;
long long hash2 = 0;
for (char c : s)
{
hash1 = ((long long)(c) + ((1LL * A * hash1) % MOD1)) % MOD1;
hash2 = ((long long)(c) + ((1LL * A * hash2) % MOD1)) % MOD2;
}
return {hash1, hash2};
}
void get_clean_init_strings_hashes()
{
clear_init_strings_hash();
for (int i = 0; i < num_init_strings; i++)
{
std::string init_string;
std::cin >> init_string;
std::pair<long long, long long> hash_of_init_string = polynomial_hash_string(init_string);
init_strings_hashes.insert(hash_of_init_string);
}
}
void get_clean_queries()
{
clear_queries();
for (int i = 0; i < num_queries; i++)
{
std::string query;
std::cin >> query;
std::pair<long long, long long> hash_of_query = polynomial_hash_string(query);
queries.push_back({hash_of_query, query});
}
}
void get_clean_inputs()
{
get_clean_init_strings_hashes();
get_clean_queries();
}
/******* QUERY PARSING FUNCTIONS ********/
bool match_init_string(std::pair<long long, long long> &hash, std::string &query)
{
return (init_strings_hashes.find(hash) != init_strings_hashes.end());
}
long long recalculate_hash(long long old_hash, int position_power, char old_char, char new_char)
{
long long adjustment_in_hash = (((long long)(new_char - old_char) * powers_of_A1[position_power]) % MOD1) + MOD1;
long long new_hash = (old_hash + adjustment_in_hash) % MOD1;
return new_hash;
}
bool parse_query(std::pair<long long, long long> &string_hash, std::string &str)
{
for (int i = 0; i < str.size(); i++)
{
for (char c = 'a'; c <= 'c'; c++)
{
if (c != str[i])
{
long long alt_str_hash1 = recalculate_hash(string_hash.first, str.size() - 1 - i, str[i], c);
long long alt_str_hash2 = recalculate_hash(string_hash.second, str.size() - 1 - i, str[i], c);
std::pair<long long, long long> alt_str_hash = {alt_str_hash1, alt_str_hash2};
if (match_init_string(alt_str_hash, str))
{
return true;
}
}
}
}
return false;
}
void parse_queries()
{
for (std::pair<std::pair<long long, long long>, std::string> hash_query : queries)
{
std::string res = (parse_query(hash_query.first, hash_query.second)) ? "YES" : "NO";
std::cout << res << std::endl;
}
}
int main()
{
populate_powers_of_A();
std::cin >> num_init_strings >> num_queries;
get_clean_inputs();
parse_queries();
return 0;
}
```
### 7. N meetings in one room
```
#include <bits/stdc++.h>
#define io ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define debug(a) cout << #a << ": " << a << endl
#define debuga1(a, l, r) fto(i, l, r) cout << a[i] << " "; cout << endl
#define ALL(a) a.begin(),a.end()
typedef long long ll;
const double PI = acos(-1.0);
const int N = 333333;
const int oo = 1e9;
using namespace std;
struct ii{
int index, startT, finishT;
};
bool cmp(ii a, ii b){
return (a.finishT < b.finishT);
}
//Khai bao
void read(){
freopen("inp.inp", "r",stdin);
freopen("out.out", "w", stdout);
}
vector<ii> meetings;
vector<bool>Chosen;
int main(){
int t, n;
cin >> t;
while(t--){
cin >> n;
meetings.assign(n + 1, ii{0, 0, 0});
Chosen.assign(n + 1, false);
for (int i = 1; i <= n; i++){
cin >> meetings[i].startT;
meetings[i].index = i;
}
for (int i = 1; i <= n; i++){
cin >> meetings[i].finishT;
}
sort(meetings.begin() + 1, meetings.begin() + 1 + n, cmp);
int curTime = meetings[1].finishT;
Chosen[1] = true;
for (int i = 2; i <= n; i++){
if (meetings[i].startT > curTime){
curTime = meetings[i].finishT;
Chosen[i] = true;
}
}
for (int i = 1; i <= n; i++){
if (Chosen[i]){
cout << meetings[i].index << " ";
}
}
cout << "\n";
}
}
```