标签:main i++ bst 计蒜客 const pac 思路 continue end
给定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; } return 0; }
思路是 使用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 ; }
标签:main i++ bst 计蒜客 const pac 思路 continue end
原文地址:https://www.cnblogs.com/dcklm/p/10344903.html