5 条题解
-
3
仅当时, 此时删除区间内的任意一个字符所对应字符串都是匹配的
#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
注意到,如果有一段连续字符相同,那么他们所对应的S也相同,那么就可以配对。比如字符串
abbbcca,中间有三个 不管删去哪个,对应的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
题意就是在一大段字符串中求每一小段字符相同的字符串中两两匹配的数量。。。
记得开long long ,
#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
#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; }
- 1
信息
- ID
- 2515
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 33
- 已通过
- 15
- 上传者