
樣例輸入:
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;
}
