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

#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string>
#include <vector>
typedef long long int ll;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000001
using namespace std;

int div_row[8] = {-1, -1, -1, 0, 0, 1, 1, 1},
    div_col[8] = {-1, 0, 1, -1, 1, -1, 0, 1}, H, W;

int main() {

  int work_row, work_col, max_length;
  char table[10][21];
  string ans;

  set<string> SPELL;

  while (true) {
    cin >> H >> W;
    if (H == 0 && W == 0)
      break;

    SPELL.clear();
    ans = "0";

    for (int i = 0; i < H; i++) {
      for (int k = 0; k < W; k++)
        cin >> table[i][k];
    }

    max_length = 2;

    for (int row = 0; row < H; row++) {
      for (int col = 0; col < W; col++) {
        for (int a = 0; a < 8; a++) {

          string work;
          work += table[row][col];

          work_row = (row + div_row[a] + H) % H;
          work_col = (col + div_col[a] + W) % W;

          while (work_row != row || work_col != col) {
            work += table[work_row][work_col];

            if (SPELL.find(work) != SPELL.end()) {
              if (work.length() > max_length) {
                max_length = work.length();
                ans = work;
              } else if (work.length() == max_length) {
                if (work < ans) {
                  ans = work;
                }
              }
            } else {
              SPELL.insert(work);
            }
            work_row = (work_row + div_row[a] + H) % H;
            work_col = (work_col + div_col[a] + W) % W;
          }
        }
      }
    }

    cout << ans << endl;
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <stdio.h>
#include <vector>
typedef long long int ll;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000001
using namespace std;

int div_row[8] = {-1, -1, -1, 0, 0, 1, 1, 1},
    div_col[8] = {-1, 0, 1, -1, 1, -1, 0, 1}, H, W;

struct Info {
  void init() { length = count = 0; }
  char spell[201];
  int length, count;
};

// base??¨comp??????????????????????????¢??°
bool strCmp(char *base, char *comp) {
  int length1 = 0, length2 = 0;
  for (int i = 0; base[i] != '\\0'; i++)
    length1++;
  for (int i = 0; comp[i] != '\\0'; i++)
    length2++;
  if (length1 != length2)
    return false;

  for (int i = 0; base[i] != '\\0'; i++) {
    if (base[i] != comp[i])
      return false;
  }
  return true;
}

void strcpy(char *to, char *str) {
  for (int i = 0; str[i] != '\\0'; i++) {
    to[i] = str[i];
    to[i + 1] = '\\0';
  }
}

//???????????????????????????3,left?????????????????´??????1,right?????????????????¨??????2
int strCmp2(char *left, char *right) {
  int i;

  if (strCmp(left, right))
    return 3;

  for (i = 0; left[i] != '\\0' && right[i] != '\\0'; i++) {
    if (left[i] != right[i]) {
      if (left[i] < right[i])
        return 1;
      else {
        return 2;
      }
    }
  }
  if (left[i] == '\\0')
    return 1;
  else {
    return 2;
  }
}

int main() {

  int work_row, work_col, work_index, ans, info_index = 0, inner_work_index,
                                           tmp, max_length;
  char table[10][21], work[201], inner_work[201];
  bool FLG;

  Info *info = (Info *)malloc(sizeof(Info) * (39800));

  while (true) {
    scanf("%d %d", &H, &W);
    if (H == 0 && W == 0)
      break;

    for (int i = 0; i < info_index; i++)
      info[i].init();

    ans = -1;       //?§£?????????????????????
    info_index = 0; // info?????????????????????

    for (int i = 0; i < H; i++) {
      scanf("%s", table[i]);
    }

    for (int row = 0; row < H; row++) {   //???????????????
      for (int col = 0; col < W; col++) { //???????????????
        for (int a = 0; a < 8; a++) {     // 8??????????????????
          work_index = 0;
          work[work_index++] = table[row][col];

          work_row = (row + div_row[a] + H) % H;
          work_col = (col + div_col[a] + W) % W;

          while (work_row != row ||
                 work_col !=
                     col) { //???????????????????????§????§????????¶???????
            work[work_index++] = table[work_row][work_col];
            // printf("work_row:%d work_col:%d\\n",work_row,work_col);
            work_row = (work_row + div_row[a] + H) % H;
            work_col = (work_col + div_col[a] + W) % W;
          }

          // return 0;

          //?????????????????£??????????????§?????§????????????????????¨??????????????????????????????
          for (int right = 1; right <= work_index - 1; right++) {
            inner_work_index = 0;
            for (int b = 0; b <= right; b++) {
              inner_work[inner_work_index++] = work[b];
            }
            inner_work[inner_work_index] = '\\0';

            //??¢?????????????????????????????????????????????
            FLG = false;
            for (int b = 0; b < info_index; b++) {
              if (strCmp(inner_work, info[b].spell)) {
                FLG = true;
                tmp = b;
                break;
              }
            }
            if (FLG) { //??¢??????????????????????????´???
              info[tmp].count++;
            } else { //??????????????????????????£?????´???
              strcpy(info[info_index].spell, inner_work);
              info[info_index].length = right + 1;
              info[info_index].count = 1;
              info_index++;
            }
          }
        }
      }
    }

    max_length = 2;

    //??????????????????????????°???
    for (int i = 0; i < info_index; i++) {

      if (info[i].count >= 2 && info[i].length >= max_length) {
        if (ans == -1) { //?????????????§£????£?
          max_length = info[i].length;
          ans = i;
        } else {
          if (info[i].length > max_length) { //???????????§???
            max_length = info[i].length;
            ans = i;
          } else { // info[i].length == max_length
            if (strCmp2(info[i].spell, info[ans].spell) ==
                1) { //?????¨????§£????????????????????§??????
              ans = i;
            }
          }
        }
      }
    }

    if (ans == -1) {
      printf("0\\n");
    } else {
      printf("%s\\n", info[ans].spell);
    }
  }

  return 0;
}