1 条题解

  • 0
    @ 2026-10-18 21:32:30

    [NOIP 2008 提高组] 笨小猴

    知识点

    字符串、频次统计、素数判定

    解题思路

    统计26个字母的出现次数,仅在出现过的字母中取最小值,计算最大与最小频次之差d,再试除判断d是否为质数。

    正确性说明

    频次数组精确记录每个字母的出现次数,取非零最小值与整体最大值即符合定义。试除到sqrt(d)即可找到任何合数的非平凡因子,因此质数判定正确。

    易错点

    没有出现的字母不能参与最小频次;0和1不是质数;不幸运时第二行必须输出0。

    复杂度

    设字符串长L,时间O(L+26+sqrt(L)),空间O(26)=O(1)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string s;cin>>s;int cnt[26]={};for(char c:s)++cnt[c-'a'];
        int lo=INT_MAX,hi=0;for(int x:cnt)if(x){lo=min(lo,x);hi=max(hi,x);}
        int d=hi-lo;bool prime=d>=2;for(int i=2;i*i<=d;++i)if(d%i==0)prime=false;
        if(prime)cout<<"Lucky Word\n"<<d<<'\n';else cout<<"No Answer\n0\n";
    }
    
    • 1

    信息

    ID
    102
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者