5 条题解

  • 3
    @ 2026-2-25 9:27:58

    仅当S[i]=S[i+1]=S[i+2]=...=S[j]S[i]=S[i+1]=S[i+2]=...=S[j]时, Si=SjS_i=S_j 此时删除[i,j][i,j]区间内的任意一个字符所对应字符串都是匹配的

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    int main()
    {
        int n; string s; cin >> n >> s;
        LL ans = 0, cnt = 0;
        for (int i = 1; i < n; i++)
        {
            if (s[i] == s[i - 1]) cnt++;
            else cnt = 0;
            ans += cnt;
        }
        cout << ans << "\n";
        return 0;
    }
    
    
    • 2
      @ 2026-2-25 9:10:13

      注意到,如果有一段连续字符相同,那么他们所对应的S也相同,那么就可以配对。比如字符串 abbbcca ,中间有三个 bb 不管删去哪个,对应的S都相等,均为 abbcca .

      温馨提示:不开 long long 见祖宗

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      ll n;
      string s;
      int main(){
      	ios::sync_with_stdio(false);
      	cin.tie(0);cout.tie(0);
      	cin>>n>>s;
      	ll r=0,c=0;
      	for(int i=1;i<n;i++){
      		if(s[i]==s[i-1])
      			c++;
      		else
      			c=0;
      		r+=c;
      	}
      	cout<<r<<"\n";
      	return 0;
      }
      
      • 2
        @ 2026-2-25 9:00:57

        题意就是在一大段字符串中求每一小段字符相同的字符串中两两匹配的数量。。。

        记得开long long , ansmax=(3e5)2ans_{max}=(3e5)^2

        #include<bits/stdc++.h>
        using namespace std;
        #define ll long long
        ll n,ans=0;char s[300010];
        int main()
        {
        	scanf("%lld",&n);
        	scanf("%s",s+1);
        	for(ll i=1,r;i<=n;i=r)
        	{
        		r=i;
        		while(r<=n&&s[i]==s[r])r++;//求每一段的尾
        		ans+=(r-i)*(r-i-1)/2;//数量求和公式
        	}
        	printf("%lld\n",ans);
        	return 0;
        }
        
        
        • 1
          @ 2026-2-25 8:55:01
          #include<bits/stdc++.h>
          using namespace std;
          #define ll long long
          int main()
          {
          	ios::sync_with_stdio(0);
          	cin.tie(0);cout.tie(0);
          	int n;string s;cin>>n>>s;
          	ll cnt=1,ans=0;
          	for(int i=1;i<n;i++)
          	{
          		if(s[i-1]==s[i])cnt++;
          		else
          		{
          			ans+=cnt*(cnt-1)/2;//从连续 cnt 个相同的字符中任选两个
          			cnt=1;
          		}
          	}
          	ans+=cnt*(cnt-1)/2;
          	cout<<ans<<endl;
          	return 0;
          }
          
          • 0
            @ 2026-2-25 9:02:55
            #include<bits/stdc++.h>
            using namespace std;
            #define int long long//一定要开long long 
            signed main()
            {
            	int n,cnt=1,ans=0;string s;
            	cin>>n>>s;
            	for(int i=1;i<n;i++)
            	{
            		if(s[i-1]==s[i])cnt++;
            		else ans+=cnt*(cnt-1)/2,cnt=1;
            	}
            	ans+=cnt*(cnt-1)/2;
            	cout<<ans;
            }	
            
            
            • 1

            信息

            ID
            2515
            时间
            2000ms
            内存
            1024MiB
            难度
            5
            标签
            递交数
            33
            已通过
            15
            上传者