萌新刚学搜索,第5点wa掉了,萌新猜测是循环队列出了锅,求助
查看原帖
萌新刚学搜索,第5点wa掉了,萌新猜测是循环队列出了锅,求助
217323
ZnH2楼主2020/6/13 20:15

尝试手写循环队列

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define ll long long
#define F(i, a, n) for (ll i = (a); i <= (n); ++i)

const ll M = 10;
const ll MAX=10000;
ll rd();
struct st {
  std::string a, b;
  ll lena, lenb;
} m[M];
ll ans = 0, i = 0, len = 1, h = 1;
std::string want;
std::string c[MAX];

void change(std::string& a) {
  F(qaq, 1, 10) {
    ll to = 0;
    F(q, h, len) {
      F(j, 1, i) {
        ll k = c[q%MAX].find(m[j].a);
        while (k != c[q%MAX].npos) {
          to++;
          c[(to + len)%MAX] = c[q%MAX];
          c[(to + len)%MAX].replace(k, m[j].lena, m[j].b);
          //std::cout << q << ' ' << c[len + to] << std::endl;
          if (c[(to + len)%MAX] == want) {
            printf("%lld\n", qaq);
            exit(0);
          }
          k = c[q%MAX].find(m[j].a, k + 1);
        }
      }
    }
    h = len + 1;
    len += to;
  }
  printf("NO ANSWER!\n");
}
int main() {
  // std::string a;
  std::cin >> c[1] >> want;
  if (c[1] == want) {
    printf("0\n");
    return 0;
  }
  // len = a.strlen();
  while (std::cin >> m[++i].a >> m[i].b) {
    m[i].lena = m[i].a.size();
    m[i].lenb = m[i].b.size();
  }
  i--;
  change(c[1]);
  return 0;
}

结果她在第五点输出了NO ANSWER自己怀疑是循环队列出了锅

尝试在本地把MAX改为10000000 得到了正确输出.当然在洛谷会MLE

在某大佬的帮助下使用了queue

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#define ll long long
#define F(i, a, n) for (ll i = (a); i <= (n); ++i)

const ll M = 10;
// const ll MAX = 1000000;
ll rd();
struct st {
  std::string a, b;
  ll lena, lenb;
} m[M];
ll ans = 0, i = 0, len = 1, h = 1;
std::string want;
// std::string c[MAX];
std::queue<std::string> c;
void change(std::string& a) {
  F(qaq, 1, 10) {
    ll to = 0;
    F(q, h, len) {
      F(j, 1, i) {
        ll k = c.front().find(m[j].a);
        while (k != c.front().npos) {
          to++;
          std::string l = c.front();
          l.replace(k, m[j].lena, m[j].b);
          // std::cout << qaq << ' ' << c[len + to] << std::endl;
          if (l == want) {
            printf("%lld\n", qaq);
            exit(0);
          }
          c.push(l);
          k = c.front().find(m[j].a, k + 1);
        }
      }
      c.pop();
    }
    h = len + 1;
    len += to;
    // putchar('\n');
    // printf("%lld\n", len - h);
  }
  printf("NO ANSWER!\n");
}
int main() {
  // freopen("1032.out","w",stdout);
  std::string a;
  std::cin >> a >> want;
  if (a == want) {
    printf("0\n");
    return 0;
  }
  c.push(a);
  // len = a.strlen();
  while (std::cin >> m[++i].a >> m[i].b) {
    m[i].lena = m[i].a.size();
    m[i].lenb = m[i].b.size();
  }
  i--;
  change(a);
  return 0;
}

虽然这次A掉了,但求问大佬,第一份代码是循环队列出锅了吗?为什么啊?萌新不胜感激

2020/6/13 20:15
加载中...