后缀字符串|计蒜客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;
}

猜你喜欢

转载自www.cnblogs.com/fisherss/p/10345577.html