尝试手写循环队列
#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掉了,但求问大佬,第一份代码是循环队列出锅了吗?为什么啊?萌新不胜感激