1 条题解

  • 0
    @ 2025-8-24 22:50:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar awesomegordon
    曼巴洲际!!!

    搬运于2025-08-24 22:50:21,当前版本为作者最后更新于2023-09-22 10:09:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    By awesomegordon.

    题意

    给定一个只由 0,6,8,90,6,8,9 组成的字符串 SS,求将S的任意非空字串进行翻转后可得到多少新字串。

    思路

    最开始是很懵的,但是却想到既然不能求到合法子串数,那就求不合法字串数。其中不合法字串分三种:

    1. 首,尾均为 00 的子串。

    统计 00 字符数量 sum1sum1,不合法子串数量为

    sum1×(sum1+1)2\dfrac{sum1\times(sum1+1)}{2}
    1. 首,尾均为 88 的子串。

    统计 88 字符数量 sum3sum3,不合法子串数量为

    sum3×(sum3+1)2\dfrac{sum3\times(sum3+1)}{2}
    1. 首,尾为 6,96,9 的字串。

    统计 6,96,9 字符数量 sum2,sum4sum2,sum4,不合法子串数量为 sum2×sum4sum2 \times sum4

    注意一点:

    如果有全为 66 或 全为 99 的字串,则答案减 11

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    string s;
    int main(){
    	//By awesomegordon 
    	int T;
    	cin>>T;
    	while(T--){
    		cin>>s;
    		ll l=s.size();
    		ll sum1=0,sum2=0,sum3=0,sum4=0;
    		//统计数字量 
    		for(int i=0;i<l;i++){
    			if(s[i]=='0'){
    				sum1++;
    			}
    			if(s[i]=='6'){
    				sum2++;
    			}
    			if(s[i]=='8'){
    				sum3++;
    			}
    			if(s[i]=='9'){
    				sum4++;
    			}
    		}
    		ll tsum=0;
    		//tsum是不符合的数量 
    		tsum+=sum1*(sum1+1)/2;
    		tsum+=sum3*(sum3+1)/2;
    		tsum+=sum2*sum4;
    		if(sum2==l||sum4==l){
    			tsum++;
    			//特判没考虑到的
    		}
    		cout<<(l+1)*l/2-tsum+1<<"\n";
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    9189
    时间
    2000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者