题源:https://hpuoj.com/contest/27/problem/F/
单点时限: 2.0 sec
内存限制: 512 MB
最近QQ更新了一个新的功能–“接龙红包”,会长作为算协的土豪,便开始在群里发红包,wzy总是抢的又快又准,现在他开始研究成语接龙的奥秘。
现在QQ的词库里面有n种成语,每种成语由一个只由小写字母组成的字符串表示,现在wzy发现了一个问题,如果有个同学说了一个成语,但是在词库里找不到可以接在它后面的成语(即找不到一个成语的首字母和该成语的尾字母相同),这样的成语被称为死局成语,现在zy想知道在词库里面有多少这样的死局成语。
输入格式
第一行输入n,接下来n行每行输入一个字符串代表一个成语s。
(1≤n≤100,1≤|s|≤20)
输出格式
第一行输出死局成语的个数m。
接下来m行每行输出一个死局成语,输出顺序应和输入顺序保持一致。
样例
input
3
aaa
bab
abc
output
1
abc
input
3
a
b
c
output
0
前言:做这个题的时候,我没认真看清题意,没有真正理解题意就慌忙去做,结果浪费了好长时间也没出结果。由此可知,不清题意不做题。还有就是尽量思路清晰后再开始做题,思路决定出路,思路清晰,能节省你的很多时间。
题解:
题意概括:
如果一个字母串尾部的字母没有在其他字符串(包括自身,头部和尾部相同的字符串绝对不会是死局成语)头部出现过,那么它是死局成语,所以只要判断一个字符串尾部的字母是否在别的字符串首部出现过就行了。
解题思路:
定义一个beg数组标记首字母,之后遍历每一个字符串,看一下每一个字符串的尾字母是否被标记,没有被标记就是死局成语。定义一个vector数组存死局成语。
AC代码:
#include <bits/stdc++.h>
using namespace std;
string s[105];
bool pre[200];//小写字母的ASCII值有的大于100,所以需要把数组定义到200
int main()
{
// freopen("input.txt","r",stdin);//注释!
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++) pre[s[i][0]]=1;
vector<string> ve;
for(int i=0;i<n;i++)
{
int l=s[i].length();
if(pre[s[i][l-1]]==0) ve.push_back(s[i]);
}
cout<<ve.size()<<endl;
for(auto v:ve) cout<<v<<endl;
return 0;
}
知识点小结:
1、vector。见我博客https://mp.csdn.net/postedit/99119371
2、求字符串的长度,见我博客https://blog.csdn.net/qq_45328552/article/details/99115898