1. 程式人生 > >NOIP2016提高組初賽(2)四、閱讀程序寫結果2、

NOIP2016提高組初賽(2)四、閱讀程序寫結果2、

cal 當前 閱讀 輸入 自己 字符 細節 一是 表示

 #include <iostream>
using namespace std;
int main() {
char a[100][100], b[100][100];
string c[100];
string tmp;
int n, i = 0, j = 0, k = 0, total_len[100], length[100][3];
cin >> n;
getline(cin, tmp);//what?我也不懂這個tmp有什麽用
for (i = 0; i < n; i++) {
getline(cin, c[i]);
total_len[i] = c[i].size();//記錄c[i]的長度
}
for (i = 0; i < n; i++) { j = 0; while (c[i][j] != :) {//c[i][j]是string變量的一種表達,表示字符串c[i]的第j個字符 a[i][k] = c[i][j];//掃描c[i],當c[i]的第j個字符不為":"時,將c[i]的字符存入a[i][k]中,即把c[i]字符串":"前的所有字符存入a[i][k]中 k = k + 1;//如果滿足c[i][j]的第j個字符不為":",就可以做到將c[i][0]-->c[i][j]中的字符存入a[i][0]-->a[i][k](k==j)中 j++; } length[i][1] = k - 1
;//記錄":"前的字符的個數 a[i][k] = 0;//記錄":"所在的位置 k = 0; for (j = j + 1; j < total_len[i]; j++) {//由於j是掃描到":"後的值再+1,所以此時的c[i][j]為":"後輸入的字符 b[i][k] = c[i][j];//掃描":"後的所有字符,將其存入b[][]中 k = k + 1; } length[i][2] = k - 1;//記錄":"後的字符的個數 b[i][k] = 0;//記錄終點位置 k = 0; } for (i = 0; i < n; i++) { if (length[i][1] >= length[i][2
])//如果":"前的字符比":"後的字符個數多 cout << "NO,";//輸出"NO" else { k = 0; for (j = 0; j < length[i][2]; j++) {//找":"後的字符 if (a[i][k] == b[i][j])//如果":"前的字符在":"後有出現 k = k + 1;//找下一個":"前的符是否有出現(不從頭找而是從當前位置往後找) if (k > length[i][1])//如果k的值比":"前的字符長度大,即已經找完了":"前的所有字符,那麽退出循環 break; } if (j == length[i][2])//如果j的值和":"後的字符串長度相等,即在掃描到最後一個點時,無論":"前的字符是否被找完,都輸出"NO," cout << "NO,"; else cout << "YES,";//如果在找完字符串之前已經找到了":"前的字符,那麽輸出"YES," } } cout << endl; return 0; }

輸入:3
AB:ACDEbFBkBD
AR:ACDBrT
SARS:Severe Atypical Respiratory Syndrome
輸出:
_________
(註:輸入各行前後均無空格)

  本人後來在編譯器上模擬了一遍,發現"AB:AB"這樣的輸入會輸出"NO",才發現這個程序原來還有這個小細節(雖然不會影響考試),這道題一開始做的時候感覺很痛苦(因為在試卷上是分頁的......),但後來放在一起看發現還挺簡單的。。。。。。

幾個細節要註意:

  一是註意它輸出的是"YES,"和"NO,",註意不要引發一場關於逗號的血案......

  二是本蒟蒻才知道原來string定義的變量是可以用c[i][j]這樣的形式表示字符串c[i]的第j個變量,感覺和vector差不多

  具體做法的話應該就是自己跑一遍程序 orz

NOIP2016提高組初賽(2)四、閱讀程序寫結果2、