1 条题解
-
0
题意分析
农夫约翰(Farmer John)记录了()条短语,每条短语的长度在到之间,由字母(区分大小写)、标点符号(
.
,
?
)或空格组成。现在有()条录音消息,每条消息可能是短语本中某个短语的前缀(包括完全匹配的情况)。我们需要统计有多少条消息是短语本中至少一个短语的前缀。解题思路
-
输入处理
- 读取和,然后读取条短语存入列表
phrases
,再读取条消息存入列表messages
。 - 由于比较是区分大小写的,因此不需要进行大小写转换。
- 读取和,然后读取条短语存入列表
-
前缀匹配检查
- 对于每条消息
msg
,检查是否存在至少一条短语phrase
,使得msg
是phrase
的前缀。 - 直接遍历所有短语,用字符串的
startswith()
方法判断即可。
- 对于每条消息
-
优化匹配效率
- 最坏情况下,每条消息需要遍历所有条短语,时间复杂度为,其中是平均短语长度。
- 由于,,,总计算量在左右,暴力匹配完全可行。
-
输出结果
- 统计满足条件的消息数量,输出答案。
标程
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <vector> using namespace std; int main() { int NUM1; int NUM2; scanf("%d %d ",&NUM1,&NUM2); string str2[NUM2]; vector<string> str1; for(int i=0;i<NUM1;i++) { char str[300]; gets(str); str1.push_back(str); } sort(str1.begin(),str1.end()); int jg=0; for(int i=0;i<NUM2;i++) { char str[300]; gets(str); str2[i]=str; int t=lower_bound(str1.begin(),str1.end(),str2[i])-str1.begin(); if((t>=0)&&(t<NUM1)) { if((str1[t].size()>=str2[i].size())&&(str1[t].substr(0,str2[i].size())==str2[i])) { jg++; } } } printf("%d",jg); return 0; }
-
- 1
信息
- ID
- 2194
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 0
- 上传者