計蒜客後綴字符串題解
阿新 • • 發佈:2019-02-01
字符串 substr 思路 nbsp std 所有 暴力 urn span
給定N個字符串Si,判斷這N個字符串中以Si作為的後綴的有幾個
1.暴力解法
主要學習的是下標的使用,我最初看到後綴,總會想著讓待比較的字符串的下表從後往前移動,然後還要判斷越界等問題,很復雜。
這裏將長度記錄下來,然後進行比較,比較直觀。
#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]; int main() {int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { int ans = 0; for (int j = 0; j < n; j++) { if (a[j].size() < a[i].size()) continue; int pos = a[j].size() - a[i].size(); //***先記錄長度差int ok = 1; for (int k = 0; k < a[i].size(); k++) { if (a[j][pos + k] != a[i][k]) { ok = 0; break; } } ans += ok; } cout << ans << endl; } return0; }
思路是 使用map 將所有的後綴都保存起來 (我想不出來。。)
處理每一個字符串,把它的所有可能出現的後綴都存在於map中
#include<iostream> #include<map> using namespace std; const int N = 100005; string a[N]; int main () { map<string, int> mp; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; 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 ; }
計蒜客後綴字符串題解