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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM