Условие
Задан некоторый абзац текста на неизвестном языке. Назовем предложение чемпионом, если количество палиндромов в нем максимально. Если таких предложение несколько, то чемпионом является то предложение, которое встретилось первым. Буквами алфавита в неизвестном языке являются буквы латинского алфавита и арабские цифры. Гарантируется, что других символов, кроме пробелов и знаков препинания в предложениях нет.
Замечание
В процессе прохождения тестов на сайте e-olymp эмпирически было выяснено, что в случае отсутствия палиндромов во всех предложения, необходимо вывести ноль.
Тесты
Входные данные | Номер предложения |
No palindrom here. Here it is: abcba! Seriously, I just hate orks… | 2 |
Some random text ahead: AaA o-O-o I. 1 22 333. Result will be 1. | 1 |
Some random text ahead: AaA o-O-o I. 1 22 333 4444. Now result will be 2! | 2 |
Some random text ahead: AaA o-O-o I. 1 — 22 — 333. Result will be 1. | 1 |
No. Palindrom. at. ALL?! | 0 |
Решение
Заведем переменную [latex]currentSentence[/latex], хранящую номер текущего предложения, будем считывать по слову и увеличивать ее значение на 1, если текущее слово заканчивается на точку, восклицательный или вопросительный знак. Далее, поочередно удаляем с конца лишние символы, заменяя их терминальным, пока не встретится первая буква. Затем переводим слово в нижний регистр и проверяем его на палиндромность, если да — увеличиваем на 1 переменную-счетчик кол-ва палиндромов в текущем предложении [latex]palCount[/latex]. Если слово было последним в предложении (за это отвечает флаг [latex]endOfSentence[/latex]) — сравниваем предложение с предыдущим чемпионом, после обнуляем значение [latex]palCount[/latex].
Код
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <iostream> #include <cstring> using namespace std; int main() { char s[256]; int maxPalNum = 0; int champion = 0; int currentSentence = 1; int palCount = 0; while (cin >> s) { if (s[0] == '-' && strlen(s) == 1) continue; //если тире, то просто считываем следующее слово bool endOfSentence = false; if (s[strlen(s)-1] == '.' || s[strlen(s)-1] == '!' || s[strlen(s)-1] == '?') endOfSentence = true; //слово - последнее в предложении for (int i = strlen(s) - 1; i >= 0; i--) { if (!(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z' || s[i] >= '1' && s[i] <= '9' || s[i] == '-')) s[i] = '\0'; else break; } for (int i = 0; i < strlen(s); i++)//перевод в нижний регистр { if (s[i] >= 'A' && s[i] <= 'Z') s[i] += 32; } bool pal = true; for (int i = 0; i < strlen(s) / 2; i++) { if (s[i] != s[strlen(s)-i-1]) { pal = false; break; } } if (pal) palCount ++; if (endOfSentence) //если слово было последним - сравниваем предложения { if (palCount > maxPalNum) { maxPalNum = palCount; champion = currentSentence; } currentSentence++; palCount = 0; } } cout << champion; return 0; } |
Ссылки
Рабочий код на Ideaone.
Засчитанное решение на E-olymp.
Хорошо. Принято.