這是問題:
在遙遠的銀河系中,有一顆塔斯星球,托丁比賽非常流行。根據傳說,有一個已知的二傳手會給出偽裝成小菜一碟問題的高級字串操作問題。
因此,法蘭西國王喜歡字母“t”。而現在,他和他的大臣們在這上面做了一個游戲!他的大臣會給他兩根弦,a 和 b。他們必須使它們完全相同,為此他可以執行以下操作-
第 1 步 - 他最多可以反轉一根弦。(這一步是可選的,他可以選擇反轉任何一個字串,或者兩個都保持原樣。)
第 2 步 - 他將兩個當前字串的第一個字符替換為“t”。此操作是強制性的。
如果他在完成這兩個步驟后能夠使兩個字串相同(即完全匹配),他就贏了。給定字串 a 和 b,判斷他們是否能贏!
輸入:
輸入的第一行包含 T - 檔案中的測驗用例數。每個測驗用例的第一行也是唯一一行包含 2 個字串,a 和 b 由一個空格分隔。
輸出:
對于每個測驗用例,如果獲勝則列印 Yes,否則列印 No
約束 1≤T≤104 1≤|a|,|b|≤100,其中 |a| 指字串a的長度。a 和 b 將只有小寫英文字母。子任務 100 分 - 原始約束。
樣本輸入:
3
曼南
abcd ebcd
abd ebf
樣本輸出:
是的
是的
不
解釋:對于第一個測驗用例,您可以將 man 反轉為 nam,然后替換兩個字串的第一個字符以獲得 tam。您也可以將 nam 反轉為 man,然后替換前兩個字符以獲得 tan。這兩種方法中的任何一種都會導致他們贏得比賽。對于第二個測驗用例,您可以簡單地跳過反轉任何字串,只需將第一個字符替換為 t 即可將兩個字串都作為 tbcd。在第三個測驗用例中,不能使 2 個字串相等。
我的代碼是:
#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 上做這個問題,所以當我提交它時,它會運行我的代碼沒有通過的自己的測驗用例(這是不可見的)。我已經嘗試了很多關于我沒有考慮的可能情況。
uj5u.com熱心網友回復:
無需插入字母“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 ) )
將迭代器定位到字串的第二個字符。
如果此條件將回傳 false,您應該將第一個字串從其第二個字符開始與第二個字串以相反的順序進行比較。這個表達
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482611.html
上一篇:Clojure:在函式呼叫中使用If陳述句作為引數,如果沒有引數,則不傳遞
下一篇:更改Pandas資料框中的值
