计蒜客后缀字符串题解
Posted dcklm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客后缀字符串题解相关的知识,希望对你有一定的参考价值。
给定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 ; }
以上是关于计蒜客后缀字符串题解的主要内容,如果未能解决你的问题,请参考以下文章
[计蒜客] ACM-ICPC 2018 南京赛区网络预赛 | 部分题解 | 线段树 + 线性筛 + 最短路