|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.06.2013, 18:21 | #1 |
Новичок
Джуниор
Регистрация: 03.06.2013
Сообщений: 2
|
Тимус
Привет всем!Помогите решить задачу из тимуса!
Задача Однажды Три Программиста придумали занятную игру для тренировки памяти и умственных способностей. Первый Программист сочинил строку S из N символов и сообщил её Второму и Третьему Программистам. Второй Программист произвёл над этой строкой X (0 ≤ X < N) последовательных циклических сдвигов (под циклическим сдвигом строки понимается перенос её последнего символа в начало). В результате этих манипуляций получилась строка T, которую он сообщил Третьему Программисту. Задачей Третьего Программиста было определить число X, либо сообщить Второму Программисту, что он ошибся, поскольку строка T не могла быть получена из строки S с помощью циклических сдвигов. Исходные данные Первая строка содержит целое число N (1 ≤ N ≤ 250000). Вторая строка содержит строку S. Третья строка содержит строку T. Обе строки имеют длину N и могут содержать любые символы таблицы ASCII с кодами от 33 до 255. Результат Если строка T может быть получена из строки S с помощью циклических сдвигов, выведите искомое число X, иначе выведите «−1». Если задача имеет несколько решений, можно вывести любое из них. Есть код, но он не работает! Помогите найти ошибку)) #include <iostream> #include <string> using namespace std; long p[260000],x,i,j,k,d,l; char t[260000],s[510000]; void prefix() { p[0]=0;k=0; for (i=1;i<x;i++) { while ((k>0)&&(t[k]!=t[i])) k=p[k]; if (t[k]==t[i]) k++; p[i]=k; } } void solve() { k=0;d=0; for (i=0;i<2*x;i++) { while ((k>0)&&(t[k]!=s[i])) k=p[k]; if (s[i]==t[k]) k++; if (k>=x) {d=1;break;} } l=2*x-i-1; if (l==x) l=0; if (d==0) cout<<-1<<endl; else cout<<l<<endl; } int main() {long l; freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); cin>>x; cin.get(); for (i=1;i<=x;i++) p[i]=0; gets(s); l=strlen(s); gets(t); strncat(s,s,l); l=strlen(s); prefix(); solve(); fclose(stdin); fclose(stdout); return 0; } |
04.06.2013, 19:00 | #2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
1) Оформляйте программный код (на форуме есть тег CODE для этого)!
2) Почему Вы считаете, что код не работает? |