计蒜客后缀字符串题解

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 ;
}

以上是关于计蒜客后缀字符串题解的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客T42256硬币--题解

计蒜客 17414 Exponial 指数降幂公式

计蒜客--无脑博士的试管们

[计蒜客] ACM-ICPC 2018 南京赛区网络预赛 | 部分题解 | 线段树 + 线性筛 + 最短路

计蒜客 17412 Card Hand Sorting 最长公共子序列

计蒜客 UCF 2015