首页 > 其他分享 >Prefixes and Suffixes 题解

Prefixes and Suffixes 题解

时间:2023-08-05 19:13:40浏览次数:35  
标签:return string int 题解 Prefixes 后缀 str 字符串 Suffixes

题目传送门

一道字符串题。

我们考虑还原字符串后再一个一个的判断。很显然,这个字符串是由一个长度为 \(n-1\) 的前缀和后缀组成的。因此我们可以找到这 \(2\) 个长度为 \(n\) 的字符串,然后枚举哪个是前缀,哪个是后缀。

值得注意的是,当你判断一个字符串为前缀时,如果后面出现了同样的字符串,你只能判断它为后缀

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n;
bool flag;
string s1, s2, t, ans1, ans2; // t 是还原串
string s[205];
map <string, bool> mp;
bool check1(string str) { // 判断这个字符串是否是还原串的前缀
    for (int i = 0; i < str.size(); i++) {
        if (t[i] != str[i]) return 0;
    }
    return 1;
}
bool check2(string str) { // 判断这个字符串是否是还原串的后缀
    int cnt = t.size() - 1;
    for (int i = str.size() - 1; i >= 0; i--) {
        if (t[cnt--] != str[i]) return 0;
    }
    return 1;
}
signed main() {
    ios :: sync_with_stdio(0);
    cin >> n;
    for (int i = 1; i <= 2 * n - 2; i++) cin >> s[i];
    for (int i = 1; i <= 2 * n - 2; i++) {
        if (s[i].size() == n - 1 and flag) s2 = s[i];
        if (s[i].size() == n - 1 and !flag) {
            s1 = s[i];
            flag = 1;
        }
    } 
    flag = 0;
    t = s1;
    t += s2[s2.size() - 1];
    // 如果 s1 是前缀
    for (int i = 1; i <= 2 * n - 2; i++) {
        if (!check1(s[i]) and !check2(s[i])) flag = 1; // 当 s1 是前缀时不合法
        else {
            if (check1(s[i]) and mp.find(s[i]) == mp.end()) {
                ans1 += 'P';
                mp[s[i]] = 1;
            }
            else ans1 += 'S';
        }
    }
    t = s2;
    t += s1[s1.size() - 1];
    // 如果 s1 是后缀
    mp.clear();
    for (int i = 1; i <= 2 * n - 2; i++) {
        if (check1(s[i]) and mp.find(s[i]) == mp.end()) {
            ans2 += 'P';
            mp[s[i]] = 1;
        }
        else ans2 += 'S';
    }
    if (!flag) cout << ans1; 
    else cout << ans2;
    return 0;
}

标签:return,string,int,题解,Prefixes,后缀,str,字符串,Suffixes
From: https://www.cnblogs.com/xvl-/p/17608440.html

相关文章

  • Educational Codeforces Round 151 (Rated for Div. 2) 题解
    A.ForbiddenInteger显然,当\(x\not=1\)时,直接输出\(n\)个\(1\)即可否则,如果\(n\)为奇数,那就输出\(\lfloor\frac{n}{2}\rfloor-1\)个\(2\)和\(3\);如果\(n\)为偶数,那就输出\(\frac{n}{2}\)个\(2\)(要看一下\(k\)的大小)B.ComeTogether因为Bob和Carol都......
  • 恋爱入门教学题解
    已知长度为\(n\)的三个两个实数序列\(A,B,X\),定义\(n\)个定义域为\(\R\)的函数\(f_1,f_2,\cdots,f_n\)。其中:\[f_k(x)=\sum_{i=1}^k|a_i(x-x_i)+b_i|\]现在,对于每一个\(k=1,2,\cdots,n\),求\(f_k\)的最小值。可以证明,最小值一定存在。\(n\le......
  • FJOI 树的重心题解
    从零开始暴切省选题题意简述给定一个\(n\)个点的树,每个点的编号从\(1\)至\(n\),问这个树有多少不同的连通子树,和这个树有相同的重心。分析1求重心首先要明确重心的定义。题目中给出:删掉某点\(i\)后,若剩余\(k\)个连通分量,那么定义\(d(i)\)为这些连通分量中点的个数......
  • P4850 [IOI2009] Raisins 题解
    前言:IOI还出这样水的纯记忆化搜索题?还是T4?真令人难以置信。题意:题目传送门一个N×M的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成1×1的方格,求最小的分割总价值之和。思路:看到这是个最优化的题,且数据范围很......
  • P9437 『XYGOI round1』一棵树 题解
    赛时一眼换根dp,然后调调调了大概1h+。题目传送门什么是换根dp在大多数树形dp中,我们只考虑对根的贡献,而一部分题目需要算出对所有点的贡献,一个比较显然的做法是对每个点都跑一次树形dp,但是大大增加了时间复杂度,是我们不能接受的。树形dp中的换根dp问题又被称为二次扫......
  • 洛谷 P7911 [CSP-J 2021] 网络连接 题解
    写在前面一道普及级别的题目。CSP-J全国统一命题2021年第三题。本题解来自于一位真正的大佬。传送门https://www.luogu.com.cn/blog/xyf007/solution-p7911。题面信息来源于洛谷。请访问https://www.luogu.com.cn/problem/P7911。声明:本题解非商业用途,一切侵权行为请联系作......
  • We Were Both Childrent 题解
    将一个好理解的方法。题目说有n只青蛙,每只青蛙初始都在0位置,每秒会往前跳a_i。你可以在位置1到n设置一个陷阱,陷阱会抓住经过它的所有青蛙,求你最多能抓住多少青蛙。很简单,只要枚举质因数并判断是否合法即可。intn,ans=0;cin>>n;memset(cnt,0,sizeofcnt)......
  • Balanced Round 题解
    原题链接。题目大意给你一些数,问至少删掉多少数后两两不大于k。我们可以画图理解。最后我们取max(2,1),由于我们求的是合法的,所以还得用长度减去2,最终答案就是2。根据图我们就知道可以遍历一遍数组,用t记录下最长合法序列长度,最后用n-t即可。代码#include<bits/......
  • CF1491B Minimal Cost 题解
    调了两个多小时终于过了,交一发题解。题目分析如果你认真读题就会发现,这道题看似有很多种情况,但障碍的移动方式其实只有几种。如果当所有障碍物都在一列时,可以将某一个障碍水平移动一格,再垂直移动一格或者水平移动两格,那么答案就是v+min(u,v)。当有通路时,则无需移动,答案就是......
  • CF1682B AND Sorting 题解
    首先,我们按照题意,可以用0来作为中间的一个数来交换其他两个数,这种元素肯定是有的,那就是所有不在正确位置上的所有数的AND值,我们可以开一个数组a来模拟这个过程,a_i&a_j=X,那这里的X就起到我们的0的作用了。代码:#include<bits/stdc++.h>#defineintlonglongusin......