题解:P14466 [COCI 2025/2026 #1] 押韵 / Rima

· · 题解

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

题意

给定 n 行,每行有 m 个字符串,每四行为一段。

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

现在有三种押韵模式:

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

思路

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

代码

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