Obaveštajna služba je presrela tajnu poruku u kojoj se pominje ime grada koji će sledeći biti napadnut. Takođe, od doušnika su saznali da je ime grada sakriveno u tekstu tako što mu je svako od slova ciklično rotirano za \(k\) (\(0 \le k \le 25\)) mesta udesno.
Za dato ime grada proveriti koje sve vrednosti može uzeti \(k\).
Sa standardnog ulaza se učitava ime grada, a zatim u novom redu tekst poruke. Obe niske su sačinjene od malih slova engleskog alfabeta.
Ispisati rastuće, svaku u svom redu, moguće vrednosti parametra \(k\).
bon erqdczhuti
3 6 15
Kada se slova reči bon rotiraju za 3 mesta udesno, dobija se reč erq. Kada se slova reči bon rotiraju za 6 mesta udesno, dobija se reč hut. Kada se slova reči bon rotiraju za 15 mesta udesno, dobija se reč qdc.
U ovom bloku se opisuje glavno rešenje zadatka.
#include<iostream>
#include<vector>
using namespace std;
vector<int> calculate_z_array(const string &s) {
int n = s.size();
vector<int> z(n);
int l = 0;
int r = 0;
for (int i = 1; i < n; i++) {
if (i <= r) {
z[i] = min(r - i + 1, z[i - l]);
}
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
z[i]++;
}
if (i + z[i] - 1 > r) {
l = i;
r = i + z[i] - 1;
}
}
return z;
}
bool check(const string& s, const string& t){
string s1 = s + "$" + t;
vector<int> z_array = calculate_z_array(s1);
for(int i = 1; i < z_array.size(); i++){
if(z_array[i] >= s.length())
return true;
}
return false;
}
void shift_right(string& s){
for(int i = 0; i < s.length(); i++){
if(s[i] == 'z')
s[i] = 'a';
else
s[i]++;
}
}
int main(){
string s, t;
cin >> s >> t;
if(check(s, t))
cout << 0 << endl;
for(int i = 1; i <= 25; i++){
shift_right(s);
if(check(s, t))
cout << i << endl;
}
return 0;
}