Problem p02269 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cctype>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <tuple>
#include <utility>
#include <vector>

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

/* attention
    long longのシフト演算には気をつけよう
    タイポした時のデバッグが死ぬほどきつくなるので変数名は最低3字くらい使った方がいいかも
*/

const long long mod = 1e9 + 7;

void chmod(long long &M) {
  if (M >= mod)
    M %= mod;
  else if (M < 0) {
    M += (abs(M) / mod + 1) * mod;
    M %= mod;
  }
}

long long modpow(long long x, long long n) {
  if (n == 0)
    return 1;
  long long res = modpow(x, n / 2);

  if (n % 2 == 0)
    return res * res % mod;
  else
    return res * res % mod * x % mod;
}

int getl(int i, int N) { return i == 0 ? N - 1 : i - 1; };
int getr(int i, int N) { return i == N - 1 ? 0 : i + 1; };

/* <----------------------------------------------------------------------------------->
 */
/* <----------------------------------------------------------------------------------->
 */
/* <----------------------------------------------------------------------------------->
 */
/* <----------------------------------------------------------------------------------->
 */

const long long M = 1046527;
const int LENGTH = 14;

char ht[M][LENGTH];

void init() {
  for (int i = 0; i < M; ++i) {
    ht[i][0] = '\\0';
  }
}

int get_int(char c) { return c - 'A' + 1; }

long long get_key(char str[]) {
  long long key = 0;
  long long d = 1;
  for (int i = 0; i < strlen(str); ++i) {
    key += d * get_int(str[i]);
    d *= 5;
  }
  return key;
}

long long h1(long long key) { return key % M; }
long long h2(long long key) { return 1 + key % (M - 1); }

bool find(char str[]) {
  long long key = get_key(str);
  for (long long i = 0;; i++) {
    long long idx = (h1(key) + i * h2(key)) % M;
    if (strcmp(ht[idx], str) == 0) {
      return true;
    } else if (strlen(ht[idx]) == 0) {
      return false;
    }
  }
}

int insert(char str[]) {
  long long key = get_key(str);
  for (long long i = 0;; i++) {
    long long idx = (h1(key) + i * h2(key)) % M;
    if (strcmp(ht[idx], str) == 0)
      return 1;
    else if (strlen(ht[idx]) == 0) {
      strcpy(ht[idx], str);
      return 0;
    }
  }
  return 0;
}

int main() {
  init();
  int n;
  scanf("%d", &n);

  char str[LENGTH];
  char com[10];

  for (int i = 0; i < n; ++i) {
    scanf("%s %s", com, str);
    if (com[0] == 'i') {
      insert(str);
    } else {
      if (find(str)) {
        printf("yes\\n");
      } else {
        printf("no\\n");
      }
    }
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return
// true; } return false; } template<class T> inline bool chmin(T& a, T b) { if
// (a > b) { a = b; return true; } return false; }

/* attention
    long longのシフト演算には気をつけよう
    タイポした時のデバッグが死ぬほどきつくなるので変数名は最低3字くらい使った方がいいかも
    sizeは(int)とキャストしよう
    ごちゃごちゃ場合分けを考える前に全探索は考えましたか？
*/

int main() {
  int N;
  cin >> N;
  map<string, int> mp;
  for (int i = 0; i < N; i++) {
    string com, s;
    cin >> com >> s;
    if (com[0] == 'i')
      mp[s]++;
    else {
      if (mp[s] == 0)
        cout << "no" << endl;
      else
        cout << "yes" << endl;
    }
  }
}