后缀字符串|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
样例输入:
3
ba
a
aba
样例输出:
2
3
1
思路一:暴力,只能过50%数据,枚举每一个字符串,内层枚举其他字符串判断是否以这个字符串为后缀
思路二:哈希表,存储每一个后缀的数目,string.substr函数取后缀
substr用法:
代码一:
#include <bits/stdc++.h>
using namespace std;
string s[10010];
int n;
int main(){
cin>>n;
for(int i = 0;i<n;i++){
cin>>s[i];
}
//ba a aba
//枚举每一个字符串
for(int i=0;i<n;i++){
int ans = 0;
int leni = s[i].size();
//枚举其他字符串
for(int j=0;j<n;j++){
if(i==j){
ans++;
continue;
}
int lenj = s[j].size();
if(lenj < leni){
continue;
}
//判断其他字符串是否以这个字符串为后缀
int flag = 1;
int p = leni - 1;
int q = lenj - 1;
//从i字符串的末尾遍历到i结束 从j的字符串末尾遍历 到j结束如果不相等就跳出
for(;p>=0,q>=0;p--,q--){
if(p<0 || q<0)break; //这里什么bug 指针内存错误
if(s[i][p] != s[j][q]){
flag = 0;
break;
}
}
if(flag) ans++;
}
cout<<ans<<endl;
}
return 0;
}
代码二:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int N = 100005;
string a[N];
/*使用map:统计数目*/
/*string.substr(i) 取*/
int main() {
map<string, int> mp;
int n;
cin >> n;
//输入每一个字符串
for (int i = 0; i < n; i++) {
cin >> a[i];
//对输入的当前字符串作 substr取每一个后缀; 并更新当前后缀在mp中的数量
for (int j = 0; j < a[i].size(); j++) {
mp[a[i].substr(j)]++;
}
}
for (int i = 0; i < n; i++) {
cout << mp[a[i]] << endl;
}
return 0;
}