Задача E. Это сдвиг?
Мальчик Кирилл написал однажды на листе бумаги строчку, состоящую из больших и маленьких латинских букв, а после этого ушел играть в футбол. Когда он вернулся, то обнаружил, что его братик Дима написал под его строкой еще одну строчку такой же длины. Дима утверждает, что свою строчку он получил циклическим сдвигом строки Кирилла направо на несколько шагов (циклический сдвиг строки abcde на 2 позиции направо даст строку deabc). Однако Дима еще маленький и мог случайно ошибиться в большом количестве вычислений, поэтому Кирилл в растерянности — верить ли Диме?
Формат входных данных
Первые две строки содержат s1 и s2 (1≤len(s1)=len(s2)≤104) — строки Кирилла и Димы соответственно. Строки состоят только из латинских букв.
Формат выходных данных
По данным строкам выведите единственное число — минимально возможный размер сдвига или −1, если Дима ошибся.
Python
Решите задачку по программированию, пожалуйста!
Если Дима прав, то строка s1 полностью содержится в строке, состоящей из двух подряд идущих строк s2. Позиция вхождения подстроки будет на 1 больше размера сдвига, а т. к. pos в Pascal для "не найдено" возвращает 0, то это тоже на 1 больше ответа.
Весь код (для версии Pascal, поддерживающей длинные строки):
readln(s1);
readln(s2);
writeln(pos(s1, s2 + s2) - 1)
Весь код (для версии Pascal, поддерживающей длинные строки):
readln(s1);
readln(s2);
writeln(pos(s1, s2 + s2) - 1)
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;
}
#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;
}
Похожие вопросы
- Какие задания из ЕГЭ по информатике можно решить вручную (без программирования)?
- Питон 3 решите задачку пожалуйста
- Помогите пожалуйста решить задачу по программированию наpython.
- ПОМОГИТЕ, ПОЖАЛУЙСТА, РЕШИТЬ ИНФОРМАТИКУ. Язык программирования Python
- Помогите решить задачку в Python (!)
- Помогите решите задачку на python
- Срочно помогите решить задачки по Python
- ПОМОГИТЕ РЕШИТЬ ЗАДАЧУ ПО ПРОГРАММИРОВАНИЮ ОЧЕНЬ НУЖНО!!!!
- Помогите решить задачу на питоне. пожалуйста.
- Помогите решить задачу в питоне, пожалуйста.