2017-02-08 25 views
-7

我昨天參加了Codeforces Round#396(Div.2)。 當我閱讀時,(A)問題在我看來很先進。 昨天和今天的一段時間,我試着解決了所有比賽時間。 我想出了一條200線長(半工作)的解決方案。然後我放棄了。這段代碼如何在C++中起作用?

我看了別人寫的東西存在,我看到最多20線長碼,似乎魔術給我。

問題要求你輸出兩個字符串的字母最長的罕見序列的長度。 你可以閱讀完整的問題就在這裏: http://codeforces.com/contest/766/problem/A

#include<bits/stdc++.h> 
using namespace std; 
string a,b; 
int main(){ 
    cin>>a>>b; 
    printf("%d",a==b?-1:max(a.size(),b.size())); 
    return 0; 
} 

這是用來解決問題的所有代碼,我真的想知道如何的代碼,一行

printf("%d",a==b?-1:max(a.size(),b.size())); 

可以解決這個「高級」任務?

+0

這一切確實是比較字符串平等,如果他們不相等,輸出較大的一個。爲什麼解決這個問題是你需要思考的問題:-) – AndyG

+1

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

[foo]?[bar]:[baj]三元相當於:if([foo])則輸出bar;否則輸出baj; – JustAnotherSoul

回答

3

如果兩個字符串相等,沒有「罕見子」。如果它們不相等,那麼任何一個都不是另一個的子序列,但每一個都是它自身的子序列,因此每一個都是「不常見的子序列」。兩者中較長的一個是最長的「不常見的子序列」,其長度是正確的答案。如果兩者不相等但長度相同,那麼每一個都是「不常見的子序列」,最長的長度就是任意一個的長度。

不要在你(或任何其他合理的人)認爲「子」是糾纏不清了。這個問題定義了「不常見的子序列」,你所要做的就是應用它的定義。這個「問題」是關於文字遊戲,而不是編碼。

+0

輝煌! ..... –

0

它似乎並沒有解決手頭的任務。當字符串相等時,它只輸出-1,當它們沒有不同時,它輸出較長字符串的長度。然而,問題要求最長的不常見的序列。它會失敗,輸入abcabcd給出了答案1寧願放棄4

什麼行代碼如下:

  • 它檢查是否a == b,該字符串是否相等。
  • 如果他們是平等的,條件A三元運算符A ? B : C true,這樣表達式會B這只是-1這裏。
  • 如果它們不相等,則將評估爲C它是最大值兩個字符串的長度,所以這將是較長的字符串的長度。
  • 然後打印三元表達式的值,儘管沒有換行符,這有點不好。

因此,代碼太短了,因爲它只解決了少數情況下的問題,而不是一般情況。

+1

'「ABCD」'本身就是一子,這是不是'「ABC」'的序列,因此它是最長的「罕見子」。 –

+0

我讀了問題陳述,這樣就沒有順序,但兩個輸入都是平等的。所以'abc'是'abcd'的子序列,因此最長的不常見的子序列是'd'。 –

+0

'「d」'是**一個**「不常見的子序列」,但它不是唯一的。問題要求**最長**的長度,最長的是「abcd」。 –

-1
printf ("%d", a == b ? -1 : max (a.size(), b.size())); 

相當於

if (a == b) { 
    printf ("%d", -1); 
} 
else { 
    if (a.size() > b.size()) { 
     printf ("%d", a.size()); 
    } 
    else { 
     printf ("%d", b.size()); 
    } 
} 

BTW這只是解決問題的一小步......

[修正]

它,問題全解決(見答案皮特貝克爾)的

+0

好,但它是公認的:d –

+0

這太糟糕了,我通過你的鏈接閱讀初始分配,而小的代碼片斷肯定不會解決這個問題。順便說一句,你說的是20行代碼?但片段只有8行。 –

+0

什麼是正確的解決方案? 順便說一句,不要評判我,我不是先進的你們是:( –