Антипалиндром
Условие задачи:
Палиндромом называют строку, читающуюся одинаково с обеих сторон. Задана строка s. Найдите её наибольшую по длине подстроку, не являющуюся палиндромом.
Входные данные
Входной файл содержит строку s. Она состоит только из строчных букв латинского алфавита, не пуста, её длина не превышает 100000 символов.
Выходные данные
В выходной файл выведите ответ на задачу, если ответов несколько — выберите лексикографически минимальный. Если все подстроки s являются палиндромами, выведите в выходной файл NO SOLUTION.
Тесты
№
|
Входные данные | Выходные данные |
1
|
abba | abb |
2
|
aaaaaaa | NO SOLUTION |
3
|
abcghgcba | abcghgcb |
4
|
abaaabbb | abaaabbb |
Код на языке C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> using namespace std; bool eqchar(string s) { // Проверка, является ли строка множеством одинаковых символов for (int i = 0; i < s.length(); i++) { if (s[i] != s[0]) return false; } return true; } bool ispal(string s) { // Проверка, является ли строка палиндромом for (int i = 0; i < s.length()/2; i++) { if (s[i] != s[s.length() - i - 1]) return false; } return true; } int main() { string s; cin >> s; if (eqchar(s)) cout << "NO SOLUTION"; else { if (!ispal(s)) cout << s; else { if (s[0] < s[1]) cout << s.substr(0, s.length() - 1); else cout << s.substr(1, s.length()); } } return 0; } |
Код на языке Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static boolean eqchar(String s) { for (int i = 1; i < s.length(); i++) { if (s.charAt(i) != s.charAt(0)) return false; } return true; } public static boolean ispal(String s) { for (int i = 0; i < s.length() / 2; i++) { if (s.charAt(i) != s.charAt(s.length() - i - 1)) return false; } return true; } public static void main(String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); String s = in .nextLine(); if (eqchar(s)) System.out.println("NO SOLUTION"); else { if (!ispal(s)) System.out.println(s); else { if (s.charAt(0) < s.charAt(1)) System.out.println(s.substring(0, s.length() - 1)); else System.out.println(s.substring(1)); } } } } |
Решение задачи:
Сперва необходимо проверить, является ли строка множеством одинаковых символов. В этом случае найти подстроку, не являющуюся палиндромом, не представляется возможным. Затем проверим, является ли входная строка палиндромом. Если нет, выведем исходную строку. Иначе необходимо вывести подстроку без первого или последнего символа (в зависимости от лексикографического порядка строки).
Условие задачи на e-olymp
Засчитанная задача на e-olymp: на языке C++
Засчитанная задача на e-olymp: на языке Java
Код задачи на C++: Ideone
Код задачи на Java: Ideone