Теневая строка - палиндромная строка нечетной длины.Задана строка S и ищется такая пара теневых строк, которые не перекрываются и существуют в строке s.Также хочет найти такую пару теневых строк, произведение длин которых дает максимально возможное значение.
intput: строка S, теневая строка
output: максимальное значение произведения теневых строк.2 <= | S |<= 100000 </p>
ввод: aaa
вывод: 1
ввод: ababb
вывод: 3
int main(){
sync
string s; cin>>s;
int n = s.size();
map<string, int> m;
vector<int> R(n+1,0);
s = "@" + s + "#";
int rp = 0, i = 1;
while (i <= n){
while (s[i - rp - 1] == s[i + 1 + rp])
rp++;
R[i] = rp;
int k = 1;
while ((R[i - k] != rp - k) && (k < rp)){
R[i + k] = min(R[i - k],rp - k);
k++;
}
rp = max(rp - k, 0);
i += k;
}
s = s.substr(1, n);
int p = 1;
FOR0(i, n){
for(int j = n-1; j > i; j--){
if(R[i+1] + i < j){
if(j-R[j+1]>R[i+1]+i)
p = max(p,(2*R[i+1]+1)*(2*R[j+1]+1));
else
p = max(p,(2*R[i+1]+1)*(2*(j-R[i+1]-i-1)+1));
}
else
p = max(p,(2*(j-i-1)+1));
}
}
cout<<p<<"\n";
return 0;
}
Не совсем правильное решение.Пожалуйста, помогите мне разобраться в проблеме.