1 条题解

  • 0
    @ 2026-5-2 21:30:17

    好一道诈骗题,被硬控一个半小时 (虽然拉着同学一起被硬控)

    题意

    机器人可以储存 kk 个操作。
    我们需要找到满足以前 kk 个字符为循环节的连续子串(此子串最后一个循环节可以不完整)。

    思路

    先考虑暴力思路:
    对于每一个起点 ii,向后枚举所有合法子串,如果不合法就停止(因为如果 (i,j)(i,j) 不是一个合法子串,那么 (i,j+1)(i,j+1) 就一定不合法)。

    预期得分:6060。 :::info[代码]

    #include<bits/stdc++.h>
    using namespace std;
    int k,ans;
    string s; 
    int main(){
    	cin >> k >> s;
    	int n=s.size();
    	for(int i=0;i<n-k;i++){
    		int j=i+k;
    		while(s[j]==s[i+(j-i)%k]) ans++,j++;
    	}
    	cout << ans;
    	return 0;
    }
    

    :::

    之后我跟同学就在字符串哈希的路上一路狂飙。

    因为有点绕,所以先给出代码。 :::success[代码]

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int k,ans;
    string s; 
    signed main(){
    	cin >> k >> s;
    	int n=s.size();
    	for(int i=0;i<n-k;i++){
    		int j=i+k;
    		while(s[j]==s[i+(j-i)%k]) j++;
    		int p=j-i-k;
    		ans+=(p+1)*p/2;
    		i=j-k;
    	}
    	cout << ans;
    	return 0;
    }
    

    :::

    我们考虑双指针:
    [i,j)[i,j) 是周期为 kk 的循环串,那么对于任意 p[i,jk]p \in [i,j - k],其对应的子串 s[pp+k1]s[p \dots p + k - 1] 也完全落在该周期段内,因此它已被包含在其中,所以我们可以 一次性累加所有这些 pp 的贡献,然后跳过它们,让 ii 进入下一个未处理区域。

    • 1

    信息

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