fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main() {
  6. string s;
  7. cin >> s;
  8. int n = s.length();
  9. //дублируем строку, чтобы иметь возможность просмотреть все циклические перестановки
  10. s += s;
  11. const int p = 31;
  12. vector <long long> p_pow (2*n); //вектор степеней числа p
  13. p_pow[0] = 1;
  14. for (int i = 1; i < 2*n; ++i) p_pow[i] = p * p_pow[i-1];
  15. long long P1 = 0, P2 = 0;
  16. for (int i = 0; i < n; ++i) {
  17. P1 += (s[i] - 'a' + 1) * p_pow[i];
  18. P2 += (s[n - i - 1] - 'a' + 1) * p_pow[i];
  19. }
  20. if (P1 == P2) {
  21. bool check = true;
  22. for (int i = 0; i < n; ++i)
  23. if (s[i] != s[n - i - 1]) check = false;
  24. if (check) {
  25. cout << "yes";
  26. return 0;
  27. }
  28. }
  29. for (int i = 0; i < n; ++i) {
  30. P1 += (s[i+n] - 'a' + 1)*p_pow[i+n] - (s[i] - 'a' + 1)*p_pow[i];
  31. P2 = (P2 - (s[i] - 'a' + 1)*p_pow[n + i - 1]) * p_pow[2] + (s[i+n]-'a' + 1) * p_pow[i+1];
  32. if (P1 == P2) {
  33. bool check = true;
  34. for (int j = i + 1; j < i + 1 + n; ++j)
  35. if (s[j] != s[2*i + 1 + n - j]) check = false;
  36. if (check) {
  37. cout << "yes";
  38. return 0;
  39. }
  40. }
  41. }
  42. cout << "no";
  43. return 0;
  44. }
  45.  
Success #stdin #stdout 0s 5584KB
stdin
array
stdout
yes