题目描述
本居小铃从她的朋友稗田阿求那里听到了一个有趣的消息:外界一个叫做“辽宁省”的地方正在举办省赛。
小铃对这个名叫“辽宁省”的地方充满了好奇。
小铃想要进一步了解辽宁省,于是她找来了许多外界的资料。
为了判断哪些资料和辽宁省有关,她想出了一种判断资料相关度的方法。
首先,小铃先选出n个单词,认为资料的相关度只与这n个单词的出现次数有关。
然后,小铃在资料中寻找这些单词,并记录它们出现的次数,出现的次数越多,小铃就认为这些资料与东北大学越相关。
现在,小铃已经选出了这n个单词,正准备开始读资料,稗田阿求却来找她借书了。你能帮助小铃完成资料的阅读,并告诉小铃资料中小铃选定的单词出现了多少次吗?
PS:来源:2021辽宁省大学生程序设计竞赛(热身赛)
链接:ac.nowcoder.com/acm/contest…
输入描述:
数据的第一行含有一个整数T(1≤T≤101 \le T \le101≤T≤10), 表示数据的组数。
对于每一组数据:
第一行含有一个整数n(1≤n≤101\le n \le 101≤n≤10),代表小铃选出的单词总数。
接下来n行,每行一个长度为w(1≤w≤101\le w \le 101≤w≤10)的、仅由小写字母组成的字符串,代表小铃选出的n个单词。
接下来一个长度为s(1≤s≤1041 \le s \le 10^41≤s≤104)的、仅由小写字母组成的字符串,代表资料的内容。
输出描述:
每组测试数据输出一个数,表示小铃选出的那些单词在资料里总共出现了多少次。
示例1
输入
2
2
neu
neuoj
neuisestablishedin1923neuojis2013
1
aa
aaa
输出
3
2
思路分析
典型的字符串匹配问题,我有两种解法
其一,使用C++ STL的find函数,返回w[i]在s 中的下标位置,默认是首次出现位置
如果没找到,find函数会返回特定标志npos,这是一个很大的数,只要position不等于npos,用来记录的times就++
AC代码2是常规的复杂操作,点赞数超过3再分析,留坑
AC代码1
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,n,t,times;
string w[10],s;
cin>>T;
while(T--)
{
times=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>w[i];
cin>>s;
for(int i=0;i<n;i++)
{
int position=s.find(w[i]);
while(position!=s.npos)
{
times++;
position=s.find(w[i],position+1);//从w[i]的第position+1个字符开始找S
}
}
cout<<times<<endl;
}
return 0;
}
AC代码2
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,n,t,flag,times;
string w[10],s;
cin>>T;
while(T--)
{
times=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>w[i];
cin>>s;
for(int j=0;j<s.length();j++)
{
for(int k=0;k<n;k++)
{
t=j;
flag=0;
for(int i=0;i<w[k].length();i++)
{
if(s[t++]!=w[k][i])
flag=1;
}
if(flag==0)
times++;
}
}
cout<<times<<endl;
}
return 0;
}
总结感悟
生命不息,码不停题!