后缀字符串|计蒜客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;
}
posted @ 2019-02-01 13:50  fishers  阅读(892)  评论(0编辑  收藏  举报