1 条题解

  • 0
    @ 2026-8-11 20:30:31

    [COCI 2025/2026 #1] 押韵 / Rima

    题意

    给定 nn 行,每行有 mm 个字符串,每四行为一段。

    我们称两个句子是押韵的,当且仅当这两句话的最后一个单词的最后 kk 个字母相同。特别地,若某句中最后一个单词不足 kk 个字母,认为这两句不押韵。

    现在有三种押韵模式:

    1. AABB\text{AABB}:一二句押韵,三四句押韵;
    2. ABAB\text{ABAB}:一三句押韵,二四句押韵;
    3. ABBA\text{ABBA}:一四句押韵,二三句押韵。

    我们现在要统计这三种押韵模式在每段中出现的次数,当然一段可能会出现多种押韵模式。


    思路

    我们可以用一个数组 ss 来储存每行的最后一个字符串,然后写一个函数来判断每段中字符串长度是否大于 kk 同时是否押韵,若是,返回 11,否则返回 00


    代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,k,d1,d2,d3;
    string s[1000086],ss;
    bool d(string s1,string s2,int kk){
        return s1.size()>=kk&&s2.size()>=kk//判断长度是否大于k
    &&s1.substr(s1.size()-kk)==s2.substr(s2.size()-kk);//判断最后k个字符是否相同
    }
    signed main(){
        cin>>n>>m>>k;
        for (int i=1;i<=n;i++){
            for (int j=1;j<=m;j++){
                cin>>ss;
            }
            s[i]=ss;//直接统计每行最后一个输入进来的字符串
        }
        for (int i=1;i<=n;i+=4){//每次按段循环
            if (d(s[i],s[i+1],k)&&d(s[i+2],s[i+3],k)){
                d1++;//AABB
            }
            if (d(s[i],s[i+2],k)&&d(s[i+1],s[i+3],k)){
                d2++;//ABAB
            }
            if (d(s[i],s[i+3],k)&&d(s[i+1],s[i+2],k)){
                d3++;//ABBA
            }
        }
        cout<<d1<<' '<<d2<<' '<<d3<<'\n';
        return 0;
    }
    
    • 1

    信息

    ID
    12614
    时间
    1000ms
    内存
    650MiB
    难度
    4
    标签
    递交数
    31
    已通过
    16
    上传者