# Magical String in C++

Suppose there is a string. That string is called a magical string S, that consists of only '1' and '2' and obeys the following rules −

• The string S is magical because concatenating the number of contiguous occurrences of characters '1' and '2' generates the string S itself.
• The first few components of string S is the following − S = "1221121221221121122……"
• If we group the consecutive '1's and '2's in S, it will be − 1 22 11 2 1 22 1 22 11 2 11 22 ...... and the occurrences of '1's or '2's in each group are − 1 2 2 1 1 2 1 2 2 1 2 2 ......

Now suppose we have an integer N as input, find the number of '1's in the first N number in the magical string S. So if the input is like 6, then the output will be 3, as first 6 elements in the magical string is “12211”. This contains three 1s, so return 3.

To solve this, we will follow these steps −

• if n <= 0, then return 0, if n <= 3, then return 1
• ret := 1, make an array arr of size n
• arr[0] := 1, arr[1] := 2, arr[2] := 2
• head := 2, tail := 3 and num := 1
• while tail < n
• for i in range 0 to arr[head] – 1
• arr[tail] := num
• if num is 1 and tail < n, then increase ret by 1
• increase tail by 1
• if tail >= n, then break the loop
• num = num XOR 3
• return ret

Let us see the following implementation to get better understanding −

## Example

Live Demo

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int magicalString(int n) {
if(n <= 0) return 0;
if(n <= 3) return 1;
int ret = 1;
vector <int> arr(n);
arr[0] = 1;
arr[1] = 2;
arr[2] = 2;
int tail = 3;
int num = 1;
while(tail < n){
for(int i = 0; i < arr[head]; i++){
arr[tail] = num;
if(num == 1 && tail < n) ret++;
tail++;
if(tail >= n) break;
}
num ^= 3;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.magicalString(6));
}

## Input

6

## Output

3