Python

Решите задачку по программированию, пожалуйста!

Задача E. Это сдвиг?

Мальчик Кирилл написал однажды на листе бумаги строчку, состоящую из больших и маленьких латинских букв, а после этого ушел играть в футбол. Когда он вернулся, то обнаружил, что его братик Дима написал под его строкой еще одну строчку такой же длины. Дима утверждает, что свою строчку он получил циклическим сдвигом строки Кирилла направо на несколько шагов (циклический сдвиг строки abcde на 2 позиции направо даст строку deabc). Однако Дима еще маленький и мог случайно ошибиться в большом количестве вычислений, поэтому Кирилл в растерянности — верить ли Диме?

Формат входных данных

Первые две строки содержат s1 и s2 (1≤len(s1)=len(s2)≤104) — строки Кирилла и Димы соответственно. Строки состоят только из латинских букв.

Формат выходных данных

По данным строкам выведите единственное число — минимально возможный размер сдвига или −1, если Дима ошибся.
Если Дима прав, то строка s1 полностью содержится в строке, состоящей из двух подряд идущих строк s2. Позиция вхождения подстроки будет на 1 больше размера сдвига, а т. к. pos в Pascal для "не найдено" возвращает 0, то это тоже на 1 больше ответа.

Весь код (для версии Pascal, поддерживающей длинные строки):

readln(s1);
readln(s2);
writeln(pos(s1, s2 + s2) - 1)
Есен Ахметов
Есен Ахметов
94 859
Лучший ответ
C++, Хэши, 100 баллов на информатиксе
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define int long long
#define endl "\n"
using namespace std;
const int inf = 1e9;
long double eps = 1e-9;
vector h;
vector p;
vector h1;
vector p1;
int b = 27;
int M = 1e9 + 7;
int get(int l, int r) {
return (h[r + 1] - (h[l] * p[r - l + 1]) % M + M) % M;
}
int get1(int l, int r) {
return (h1[r + 1] - (h1[l] * p1[r - l + 1]) % M + M) % M;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
string s, t, t1;
cin >> t1 >> s;
if (t1 == s) {
cout << 0;
return 0;
}
t = t1;
t += t1;
int n = t.size();
h.resize(n + 1);
p.resize(n + 1);
int len, i;
h[0] = 0;
p[0] = 1;
for (i = 0; i < n; i++) {
h[i + 1] = (h[i] * b + (t[i] - 'a' + 1)) % M;
p[i + 1] = (p[i] * b) % M;
}
n = s.size();
h1.resize(n + 1);
p1.resize(n + 1);
h1[0] = 0;
p1[0] = 1;
for (i = 0; i < n; i++) {
h1[i + 1] = (h1[i] * b + (s[i] - 'a' + 1)) % M;
p1[i + 1] = (p1[i] * b) % M;
}
int ep = s.size();
for (i = 0; i <= t.size() - ep; i++) {
if (get(i, i + ep - 1) == get1(0, ep - 1)) {
cout << s.size() - i;
return 0;
}
}
cout << "-1";
return 0;
}
Extreme Extreme
Extreme Extreme
113