专栏文章

题解:P14317 「ALFR Round 11」A 浴眼盯真 (dingzhen)

P14317题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@min41kv7
此快照首次捕获于
2025/12/01 20:13
3 个月前
此快照最后确认于
2025/12/01 20:13
3 个月前
查看原文

题目大意:

给你一个字符串保证全都是小写字母,问是否满足条件:
  1. 该字符串需要包括 26 个小写字母
  2. 该字符串的一个字串(不包括本身)是否满足条件 1。
若两个条件都满足输出 Yes,否则输出 No 并输出它不满足的条件。

思路:

利用 map 存储每个字符的信息,若该字符串不包括 aza \sim z 说明两个条件都不满足(若本身不包括,字串不可能凭空造一个吧)。
然后子串肯定选取的越长越好,既然不能包括本身,那么要么选取字串为 1n11 \sim n - 1,要么为 2n2 \sim n。那么只需要判断是否开头和末尾的字符是否都只出现了一次,即选取了 1n11 \sim n - 1 就缺失最后一个字符,选取了 2n2 \sim n 就缺失第一个字符,举个例子:对于字符串 abcdefghijklmnopqrstuvwxyz 其本身满足条件 1,但子串选取时最长只能是 bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy 由于无法包括的字符只出现了一次,选取的子串无法包括,不能满足条件 2。

代码:

CPP
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
int t;
map<char,int>m;
void solve(){
    string a;
    cin >> a;
    m.clear(); 
    if(a.size() < 26){cout << "No\n1 2\n";return;}
    for(auto x:a)m[x] ++;
    for(int i = 0;i < 26;i ++){
        if(m['a' + i] == 0){//本身缺少字符 
            cout << "No\n1 2\n";return;
        }
    }
    if(m[a[a.size() - 1]] == 1 and m[a[0]] == 1){//需要舍弃的字符只出现过一次 
        cout << "No\n2\n";
    }else{
        cout << "Yes\n";
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> t;
    while(t --){
        solve();
    }
    return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...