题解 P4432 【[COCI2017-2018#2] ZigZag】

没有C++题解?我来一发

这题目实际上可以用C++vector轻松解决

具体代码里说吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int n,k,q[30];//q为以a开头的单词中应该选的序号
vector <string> a[30];//建立一个以首字母序号为索引的vector
char c;
int main(){
scanf("%d%d",&k,&n);
while(k--){
string s;
cin>>s;
a[s[0]-'a'].push_back(s);//vector的基本用法
}
for (int i=0;i<26;i++)sort(a[i].begin(),a[i].end());//C++对string的排序默认按字典序
while (n--){
cin>>c;
cout<<a[c-'a'][q[c-'a']]<<endl;
q[c-'a']=(q[c-'a']+1)%a[c-'a'].size();//+1指向下一个,同时取模
//经观察可发现:
//单词:zadar zoo
//次数:0 0
//第一次选zadar:
// zadar zoo
// 1 0
//则第二次选zoo:
// zadar zoo
// 1 1
//第三次又选zadar:
// zadar zoo
// 2 1
//…
//则可以发现:无论有多少次,在同一字母开头的单词中下标一直单调递增
//所以直接+1就可以啦。
}
}