Задача
Мое решение#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int tt;
cin >> tt;
while (tt--) {
int n;
char c;
string s;
cin >> n >> c >> s;
string b = s;
sort(b.begin(), b.end());
if (b[0] == b[b.size() - 1]) {
cout << "0" << '\n';
continue;
}
vector<bool>prime(n + 1, true);
prime[0] = prime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (prime[i]) {
for (int j = i * i; j <= n; j += i)
prime[j] = false;
}
}
int ans = 0;
for (int i = n; i >= 0; i--) {
if (prime[i]) {
ans = i;
break;
}
}
if (s[ans - 1] == c) {
cout << "1" << '\n' << ans << '\n';
}
else {
cout << "2" << '\n';
if (ans < n)
cout << ans << " " << ans + 1 << '\n';
else
cout << ans - 1 << " " << ans << '\n';
}
}
return 0;
}
Читаемость кода плоха, поэтому напишу свой алгоритм сюда.
Сначала проверяем случай когда все буквы в строке равны символу c. Потом находим с помощью Эратосфена наибольшее простое число ans в отрезке [1,n], так как никакое число из этого диапазона на него не делится кроме него самого. Затем проверяем s[ans-1]==c, если так то ответ только ans, иначе ans, ans+-1.
Где у меня ошибка (в алгоритме, в коде или и там и там) ?