[APC001] C - Not APC
2024年12月25日大约 1 分钟
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3000000;
int T;
string s;
bool flag[MAXN + 5]; // 存每个位置是否被消掉了
// 按顺序存所有 A、P、C 的下标
int cntA, cntP, cntC;
int A[MAXN + 5], P[MAXN + 5], C[MAXN + 5];
// 存每组被消除的位置
vector<int> ansA, ansP, ansC;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> T;
while (T--)
{
cin >> s;
cntA = cntP = cntC = 0;
for (int i = 0; i < s.size(); i++)
{
flag[i] = false;
if (s[i] == 'A')
{
cntA++;
A[cntA] = i;
}
if (s[i] == 'P')
P[++cntP] = i;
if (s[i] == 'C')
C[++cntC] = i;
}
/*
for(int i=1;i<=cntA;i++)
cout<<A[i]<<",";
cout<<"\n";
for(int i=1;i<=cntP;i++)
cout<<P[i]<<",";
cout<<"\n";
for(int i=1;i<=cntC;i++)
cout<<C[i]<<",";
cout<<"\n";
*/
ansA.clear();
ansP.clear();
ansC.clear();
// 当前三个数组处理到的位置
int posA, posP, posC;
posA = posP = posC = 1;
while (posA <= cntA &&
posP <= cntP &&
posC <= cntC)
{
if (A[posA] < P[posP] &&
P[posP] < C[posC])
{
ansA.push_back(A[posA]);
ansP.push_back(P[posP]);
ansC.push_back(C[posC]);
flag[A[posA]] = true;
posA++;
flag[P[posP++]] = true;
flag[C[posC++]] = true;
}
else
{
if (P[posP] < A[posA])
posP++;
else if (C[posC] < P[posP])
posC++;
else
posA++;
}
}
// 输出消除完的字符串
if (ansA.size() * 3 == s.size())
cout << "Perfect\n";
else
{
for (int i = 0; i < s.size(); i++)
if (!flag[i])
cout << s[i];
cout << "\n";
}
// 输出消除方案
cout << ansA.size() << "\n";
for (int i = 0; i < ansA.size(); i++)
cout << ansA[i] + 1 << " " << ansP[i] + 1 << " " << ansC[i] + 1 << "\n";
}
return 0;
}