Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 18:21   #1
Виктория2909
Новичок
Джуниор
 
Регистрация: 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;
}
Виктория2909 вне форума Ответить с цитированием
Старый 04.06.2013, 19:00   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Оформляйте программный код (на форуме есть тег CODE для этого)!
2) Почему Вы считаете, что код не работает?
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц