NOIP2016提高組初賽(2)四、閱讀程序寫結果2、
阿新 • • 發佈:2017-10-10
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、