CAESAR'S CIPHER**

QUESTION : -

[N.B. - This question has been taken from CAESAR'S CIPHER]
Caesar's Cipher is a very famous encryption technique used in cryptography. It is a type of substitution cipher in which each letter in the plaintext is replaced by a letter some fixed number of positions down the alphabet. For example, with a shift of 3, D would be replaced by G, E would become H, X would become A and so on.
Encryption of a letter X by a shift K can be described mathematically as EK(X) = (X+K) % 26.
Given a plaintext and it's corresponding ciphertext, output the minimum non-negative value of shift that was used to encrypt the plaintext or else output -1 if it is not possible to obtain the given ciphertext from the given plaintext using Caesar's Cipher technique.

Input: 
The first line of the input contains Q, denoting the number of queries. 
The next Q lines contain two strings S and T consisting of only upper-case letters.

Output: 
For each test case, output a single non-negative integer denoting the minimum value of shift that was used to encrypt the plaintext or else print -1 if the answer doesn't exist.

Constraints:
  • 1 ≤ Q ≤ 5
  • 1 ≤ |S| ≤ 105
  • 1 ≤ |T| ≤ 105
  • |S| ≤ |T|

SAMPLE INPUT
2
ABC
DEF
AAA
PQR

SAMPLE OUTPUT
3
-1

Explanation:

In the first test case, A is replaced by D, B by E and C by F. It is easy to make out that a shift of 3 has been used for encrypting the plain text.

In the second test case, the value of the shift is not consistent for all letters of the plain text. Thus, we can safely come to the conclusion that the plain text has not been encrypted using Caesar's Cipher. Hence, the answer is no.

Time Limit: 1.0 sec(s) for each input file.
Memory Limit: 256 MB
Source Limit: 1024 KB


Ans:-

This question is a mere cakewalk. For understanding, I am dividing the solution into four steps (NB - The code can be smaller).
  1. Converting a string to the corresponding array of an integer using ASCII
  2. Setting the value of variable named "min"
  3. Checking for each iteration and setting value of the flag.
  4. Output according to flag.

Have a look at the code below,
C++ Approach:-
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        string input,output;
        cin >> input;
        cin >> output;
        int l1,l2;
        l1 = input.size();
        l2 = output.size();
        int input1[l1],output1[l2];
        
        /// Converting string to corresponding array of integer using ASCII
        for(int i=l1-1;i>=0;i--)
        {
            input1[i] = input[i]-65+1;
        }
        for(int i=l2-1;i>=0;i--)
        {
            output1[i] = output[i]-65+1;
        }
        int flag=0,min;
        
        /// Setting the value of minimum
        if(input1[0]>=output1[0])
        {
            min = input1[0]-output1[0];
        }
        else
        {
            min = abs((26-abs(input1[0]-output1[0])));
        }
        
        /// Checking the value of minimum and setting flag value accordingly
        for(int i=0;i<l1;i++)
        {
            if(input1[i]<output1[i])
            {
                if(abs(input1[i]-output1[i])!=abs((26-abs(min))))
                {
                    flag++;
                }
            }
            else if(abs(input1[i]-output1[i])!=abs(min))
            {
                flag++;
            }
        }
        
        /// Checking the value of flag and output accordingly.
        if(flag>0)
        {
            cout << "-1" << endl;
        }
        else if(min<0)
        {
            cout << abs(min)  << endl;
        }
        else if(min==0)
        {
            cout << "0" << endl;
        }
        else
        {
            cout << 26-min << endl;
        }
    }
    return 0;
}

Hope that helps. Keep coding :)

Comments