CHEFCHR - Editorial

Author: Shivam Rathore
Tester: Hanlin Ren
Editorialist: Hanlin Ren

CAKEWALK

None

PROBLEM:

Chef has a string consisting of only lowercase letters `a-z`. He wants to pick 4 consecutive letters from the string such that the 4 letters can be arranged into the word `chef`. Find the number of ways to do this.

EXPLANATION:

The solution is straightforward. Let the string be s[0\dots(n-1)]. Let’s enumerate the start point of these letters, say i. Then 0\le i\le n-4. The four letters are s[i],s[i+1],s[i+2],s[i+3]. To check if they can be arranged into `chef`, we can sort these letters and check if they form `cefh` in order. Let me explain in details.

Checking four letters

First, we need a subprocedure which given 4 letters `s1`, `s2`, `s3`, `s4`, determine if they can be reordered into `chef`. Let’s call it `check(s1, s2, s3, s4)`. A method to do this is to sort the letters, and the result of sorting should be `cefh`. C++ code:

``````bool check(char s1, char s2, char s3, char s4) {
char s[5] = {s1, s2, s3, s4, 0};
sort(s, s + 4);
return strcmp(s, "cefh") == 0;//strcmp returns 0 if two strings are equal
}
``````

The `0` at the end of array `s` is necessary, since `strcmp` recognizes it as the end of string. Or, if you don’t like `strcmp`, the last line can be written as

``````return s[0]=='c' && s[1]=='e' && s[2]=='f' && s[3]=='h';
``````

The original problem

Given the subprocedure `check`, the rest is easy:

• We enumerate the start i of the four letters. Let n be the length of string, we have 0\le i\le n-4, and four letters are `s[i]`, `s[i+1]`, `s[i+2]`, `s[i+3]`;
• If `check(s[i],s[i+1],s[i+2],s[i+3])`, the answer is increased by 1;
• At last, if answer is 0, output `normal`; otherwise output `lovely` and the answer.

Code:

``````n = strlen(s); //s[0..n-1]
//check all possible i's
for (i = 0; i <= n - 4; i++)
if (check(s[i], s[i + 1], s[i + 2], s[i + 3]))
``````

AUTHOR’S AND TESTER’S SOLUTIONS:

Author’s solution can be found here.
Tester’s solution can be found here.

https://pastebin.com/aq7mK1cJ

Can anyone tell me why I am getting wrong answer? Not able to figure out.

Can anyone tell what is wrong?

can anybody tell me the problem in the code please

#include<string.h>
#include
using namespace std;
int main(){
long long int t;
cin>>t;
while(t–){
char str[500005];
long long int l=0,i=0;
cin.getline(str,500005);
l=strlen(str);

``````long long int count=0;
for(int i=0;i<l;i++){

if(str[i]=='c'||str[i]=='h'||str[i]=='e'||str[i]=='f')
if((str[i+1]=='c'||str[i+1]=='h'||str[i+1]=='e'||str[i+1]=='f')&&(str[i]!=str[i+1]))
if((str[i+2]=='c'||str[i+2]=='h'||str[i+2]=='e'||str[i+2]=='f')&&(str[i]!=str[i+2])&&(str[i+1]!=str[i+2]))
if((str[i+3]=='c'||str[i+3]=='h'||str[i+3]=='e'||str[i+3]=='f')&&(str[i]!=str[i+3])&&(str[i+1]!=str[i+3])&&(str[i+2]!=str[i+3]))
count++;
``````

}
if(count>0){

``````	cout<<"lovely "<<count<<endl;
}
else
cout<<"normal"<<endl;
``````

}
return 0;

}

I am getting a segmentation Error in this problem

`````` #include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include <stdio.h>
using namespace std;
void meth( char *s,int &m){
vector<char> vec;
for(int i=0;i<4;i++){
if(s[i]=='c'||s[i]=='h'||s[i]=='e'||s[i]=='f'){

if( std::find(vec.begin(), vec.end(),s[i])==vec.end()){
vec.push_back(s[i]);
}
}
}
if(vec.size()==4){
m=m+1;
}
}

int main(){
int t=0;
cin>>t;
while(t-->0){
string s1;
cin>>s1;
const char *c=s1.c_str();
char s[5];
int ans=0;
for(int i=0;i<s1.length()-3;i++){
int x=i;
int count=0;
//cout<<c[i]<<" "<<endl;
if(c[i]=='c'||c[i]=='h'||c[i]=='e'||c[i]=='f'){
while(count!=4){
s[count]=c[x];
count++;
x++;
}

}

meth(s,ans);
}
if(ans>0){
cout<<"lovely"<<" "<<ans;
}
else{
cout<<"normal"<<endl;
}
cout<<"\n";
//  delete[] s;

// cout<<ans<<endl;
}
}``````

Can anyone help me out because i am getting segmentation fault when i am submitting my solution
https://www.codechef.com/viewsolution/22576965

//