NOI0107字串最大跨距

2021-09-29 22:11:52 字數 3429 閱讀 9660

這裡是乙個究極瓜皮,十個小時才做出來…

這裡是題幹@

一道很明顯的模擬題,一般都只要按照題幹的流程就ac了

#include

using

namespace std;

intmain()

if(flag==1)

if(flag==2)

}else}if

(strstr

(a,b)

!=null

&&strstr

(a,c)

!=null

) z[t2-t3]

='\0'

;while

(strstr

(z,c)

!=null

) z[t2-t3]

='\0';}

cout<}else cout<<

"-1"

;return0;

}

然後在經過了很久很久之後找出來的問題:

1、strstr的找位置的用法

**裡是用了strstr和strlen通過strstr輸出的是從第乙個找到的字元到陣列結尾的字串,然後用strlen來判斷。**但是!!**這個方式是錯的(應該)(具體的錯誤原因還在找希望大佬解答)

然後是正確用法:

strstr()-陣列引數

例子:

char a[

100]

,b[10];

int n=

strstr

(a,b)

-a;//在a當中尋找第乙個b字串並輸出位置

strstr的返回值為指標,然後a也是乙個指標並指向a[0],然後相減就可以得到在a中的位置了

千萬要記住!輸出的位置是a的位置,可能是0的那種

ps:strstr()在找不到的時候會返回null;

2、乙個非常非常低階的讀題失誤

在題幹中可以看到要求s1,s2不能交叉

看看上面那段**,就可以發現沒有編寫關於這個要求的**

這個沒什麼好說的,直接加進去就可以了

3、關於陣列初始化的問題

很明顯在這裡沒有對陣列進行任何初始化操作,不過這題裡沒有問題

於是打算放到下一次裡湊字數

#include

#include

#include

#include

#include

using

namespace std;

intmain()

if(flag==1)

if(flag==2)

}else}if

(!strstr

(a,b)||!

strstr

(a,c)

) t=

strlen

(a);

t1=strstr

(a,b)

-a;for

(int i=

0;i) ad[t]

='\0'

; t3=

strlen

(c);

for(

int i=

0;i) c1[t3]

='\0'

; t2=

strstr

(ad,c1)

-ad;

if(t>=t1+t2+t3+

strlen

(b))cout

(b)

"-1"

}

這一段**就是上一段**把前面的問題改掉,然後再加了一點點小小的變動

#include

#include

#include

using

namespace std;

char s[

310]

,s1[20]

,s2[20]

,y[310

],ss2[20]

;int flag=

0,l,r,len1,len2,res;

voidf(

) y[k]

='\0'

; len=

strlen

(s2)

,k=0

;for

(int i=len-

1;i>=

0;i--

) ss2[k]

='\0';}

intmain()

len1=

strlen

(s1)

;len2=

strlen

(s2)

; l=

strstr

(s,s1)

-s;r=

strstr

(s,s2)

-s;if

(l+len1-

1>=r)f(

);//把s翻轉方便求s2最右邊起始點

r=strstr

(y,ss2)

-y; res=

strlen

(s)-l-len1-len2-r;

cout<}

大佬和我不同的地方:

1、cin.getline

用cin會有一些的難受的地方,比如這題當中的要用,隔開兩個輸入量

就會變得很麻煩(具體多麻煩參考上面本菜雞的**)

但是!!這是一種全新的體驗,只要三分鐘你就能愛上這種感覺 cin.getline就可以完美解決這個問題

對於cin.getline的輸入格式

cin.getline(儲存的陣列/引數,輸入的個數,乙個字元/數字/無)

ps:輸入的個數最好為最大值,不然會出現一些因缺思廳的問題

當遇到這個字元/數字的時候cin.getline結束(不讀入這個字元/數字並且在下次讀入時也不會有這個字元/數字)當然無的話就可以當作乙個cin(限制輸入個數的)來用

2、函式

當在做乙個模擬題的時候會發現自己會用到很多很多相同的**或者把一坨放在main裡面很難受

這時候運用函式就會舒服很多了(雖然在本質上沒有區別,**也不會變少)

同時這也可以更好地理解**(只要在呼叫函式的地方來乙個標註就ok了也不用上下翻看main)

ps:呼叫函式的時候會存在形參和實參的問題,解決的辦法一種是指標,另一種就是這種粗暴的直接定義全域性引數,這樣在函式和main都可以使用了(指標…本著能不用就不用)

emmmm第一次寫部落格,而且還是乙個菜雞,所以可能會存在各種學術問題或者邏輯表達問題

麻煩各位大佬多多指正,最後關注和諧,謀求發展(來自於乙個b站up主)。

26 字串最大跨距

總時間限制 1000ms 記憶體限制 65536kb 描述有三個字串s,s1,s2,其中,s長度不超過300,s1和s2的長度不超過10。想檢測s1和s2是否同時在s 現,且s1位於s2的左邊,並在s中互不交叉 即,s1的右邊界點在s2的左邊界點的左側 計算滿足上述條件的最大跨距 即,最大間隔距離 ...

字串最大跨距

描述 有三個字串s,s1,s2,其中,s長度不超過300,s1和s2的長度不超過10。想檢測s1和s2是否同時在s 現,且s1位於s2的左邊,並在s中互不交叉 即,s1的右邊界點在s2的左邊界點的左側 計算滿足上述條件的最大跨距 即,最大間隔距離 最右邊的s2的起始點與最左邊的s1的終止點之間的字元...

PTA7 7 h0093 字串最大跨距

一 題目描述 二 解題思路 首先利用string把整個字串讀入 然後用逗號進行分隔成三個字串,然後用find和rfind函式解決即可。三 實現 1 include bits stdc h 2 using namespace std 3int main 417 if vis1 vis2 18 s u ...