请帮我看看我错过了什么案例
Please help me find what case am I missing
这是问题:
In a far away Galaxy of Tilky Way, there was a planet Tarth where the sport of Tompetitive Toding was very popular. According to legends, there lived a setter known to give advanced string manipulation problems disguised as cakewalk problems.
thef, the king of thefland loved the letter 't'. And now, he has made a game on it with his ministers! His ministers would give him 2 strings, a and b. thef has to make them exactly same, for which he can do the following-
Step 1 - He MAY reverse at most one of the strings. (This step is optional, and he can choose to reverse any one of the strings, or leave both of them as it is.)
Step 2 - He replaces the first character of both the current strings to 't'. This operation is compulsory.
He wins if he is able to make both the strings same (i.e. an exact match) after doing these two steps. Given the strings a and b, tell if thef can win or not!
Input:
The first line of input contains T - The number of test cases in the file. The first and only line of every test case contains the 2 strings, a and b separated by a single space.
Output:
For each test case, print Yes if thef wins, else print No
Constraints 1≤T≤104 1≤|a|,|b|≤100, where |a| refers to the length of
string a. a and b will have ONLY lower case English alphabets.
Subtasks 100 points- Original Constraints.
Sample Input:
3
man nam
abcd ebcd
abd ebf
Sample Output:
Yes
Yes
No
EXPLANATION: For the first test case, you can reverse man to nam and
then replace both first characters of both strings to get tam. You
could also have reversed nam to man, and then replaced the first two
characters to get tan. Either of these two methods leads thef to win
the game. For the second test case, you can simply skip reversing any
of the strings and just replace the first characters by t to get both
the strings as tbcd. The 2 strings cannot be made equal in the third
test case.
我的代码是:
#include <iostream>
using namespace std;
#include <bits/stdc++.h>
#include<string.h>
int main() {
int test;
cin>>test;
while(test--){
string str1{},str2{},str3{};
cin>>str1>>str2;
str3=str2;
str1[0]='t';
str3[0]='t';
if(str1==str3){
cout<<"Yes"<<endl;
}
else{
int len=str2.length();
int n=len-1;
for(int i=0;i<len/2;i++){
swap(str2[i],str2[n]);
n=n-1;
}
str2[0]='t';
if(str2==str1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
return 0;
}
现在,当我 运行 使用提供的测试用例时,我得到了预期的输出。
但是因为我在 Codechef 上做这个问题,所以当我提交它时,它 运行 有自己的测试用例(不可见),我的代码没有通过。我已经尝试思考很多我没有考虑的可能情况。
无需插入字母't'即可判断两个字符串是否重合
写if语句就够了
#include <iterator>
#include <algorithm>
//...
auto win = []( const auto &s1, const auto &s2 )
{
return ( std::size( s1 ) == std::size( s2 ) ) &&
( std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::begin( s2 ) ) ) ||
std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::rbegin( s2 ) ) ) );
};
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
也就是首先要比较两个字符串的长度是否相同
std::size( s1 ) == std::size( s2 )
上面的记录也可以这样写
s1.sisze() == s2.size()
然后你需要使用标准算法从第二个字符开始比较两个字符串 std::equal
这个表达式
std::next( std::begin( s1 ) )
将迭代器定位到字符串的第二个字符。
如果此条件 return 为假,您应该比较从第二个字符开始的第一个字符串与第二个字符串的相反顺序。这个表达式
std::next( std::rbegin( s2 ) )
将第二个字符串的反向迭代器定位到字符串从末尾开始的第二个字符。
这个复合条件写成在 if 语句中调用的 lambda 表达式。
这里有一个演示程序。
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
auto win = []( const auto &s1, const auto &s2 )
{
return ( std::size( s1 ) == std::size( s2 ) ) &&
( std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::begin( s2 ) ) ) ||
std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::rbegin( s2 ) ) ) );
};
std::string s1( "abcd" ), s2( "ebcd" );
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
s1 = "man"; s2 = "nam";
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
s1 = "abd"; s2 = "ebf";
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
}
程序输出为
Yes
Yes
No
这是问题:
In a far away Galaxy of Tilky Way, there was a planet Tarth where the sport of Tompetitive Toding was very popular. According to legends, there lived a setter known to give advanced string manipulation problems disguised as cakewalk problems.
thef, the king of thefland loved the letter 't'. And now, he has made a game on it with his ministers! His ministers would give him 2 strings, a and b. thef has to make them exactly same, for which he can do the following-
Step 1 - He MAY reverse at most one of the strings. (This step is optional, and he can choose to reverse any one of the strings, or leave both of them as it is.)
Step 2 - He replaces the first character of both the current strings to 't'. This operation is compulsory.
He wins if he is able to make both the strings same (i.e. an exact match) after doing these two steps. Given the strings a and b, tell if thef can win or not!
Input:
The first line of input contains T - The number of test cases in the file. The first and only line of every test case contains the 2 strings, a and b separated by a single space.
Output:
For each test case, print Yes if thef wins, else print No
Constraints 1≤T≤104 1≤|a|,|b|≤100, where |a| refers to the length of string a. a and b will have ONLY lower case English alphabets. Subtasks 100 points- Original Constraints.
Sample Input:
3
man nam
abcd ebcd
abd ebf
Sample Output:
Yes
Yes
No
EXPLANATION: For the first test case, you can reverse man to nam and then replace both first characters of both strings to get tam. You could also have reversed nam to man, and then replaced the first two characters to get tan. Either of these two methods leads thef to win the game. For the second test case, you can simply skip reversing any of the strings and just replace the first characters by t to get both the strings as tbcd. The 2 strings cannot be made equal in the third test case.
我的代码是:
#include <iostream>
using namespace std;
#include <bits/stdc++.h>
#include<string.h>
int main() {
int test;
cin>>test;
while(test--){
string str1{},str2{},str3{};
cin>>str1>>str2;
str3=str2;
str1[0]='t';
str3[0]='t';
if(str1==str3){
cout<<"Yes"<<endl;
}
else{
int len=str2.length();
int n=len-1;
for(int i=0;i<len/2;i++){
swap(str2[i],str2[n]);
n=n-1;
}
str2[0]='t';
if(str2==str1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
return 0;
}
现在,当我 运行 使用提供的测试用例时,我得到了预期的输出。
但是因为我在 Codechef 上做这个问题,所以当我提交它时,它 运行 有自己的测试用例(不可见),我的代码没有通过。我已经尝试思考很多我没有考虑的可能情况。
无需插入字母't'即可判断两个字符串是否重合
写if语句就够了
#include <iterator>
#include <algorithm>
//...
auto win = []( const auto &s1, const auto &s2 )
{
return ( std::size( s1 ) == std::size( s2 ) ) &&
( std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::begin( s2 ) ) ) ||
std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::rbegin( s2 ) ) ) );
};
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
也就是首先要比较两个字符串的长度是否相同
std::size( s1 ) == std::size( s2 )
上面的记录也可以这样写
s1.sisze() == s2.size()
然后你需要使用标准算法从第二个字符开始比较两个字符串 std::equal
这个表达式
std::next( std::begin( s1 ) )
将迭代器定位到字符串的第二个字符。
如果此条件 return 为假,您应该比较从第二个字符开始的第一个字符串与第二个字符串的相反顺序。这个表达式
std::next( std::rbegin( s2 ) )
将第二个字符串的反向迭代器定位到字符串从末尾开始的第二个字符。
这个复合条件写成在 if 语句中调用的 lambda 表达式。
这里有一个演示程序。
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
auto win = []( const auto &s1, const auto &s2 )
{
return ( std::size( s1 ) == std::size( s2 ) ) &&
( std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::begin( s2 ) ) ) ||
std::equal( std::next( std::begin( s1 ) ), std::end( s1 ),
std::next( std::rbegin( s2 ) ) ) );
};
std::string s1( "abcd" ), s2( "ebcd" );
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
s1 = "man"; s2 = "nam";
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
s1 = "abd"; s2 = "ebf";
if ( win( s1, s2 ) )
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
}
程序输出为
Yes
Yes
No