每日打卡 22 11 16 CF 1694B Paranoid String
蒟蒻一個,從今天起每天一道CF1000-1400的思維題.........希望可以堅持下去.
題目大意如下:
給定一個m長的01字符串然后你可以對他進行至多m-1次如下操作:
1:將一個”01“字串變為”1“
2:將一個”10“字串變為”0“
后將其變為長度為1的字符串;
現在有長度n的01字符串請問多少個字串滿足上述條件
t組數據。
t<=100,n<=2e5;
所有的n<=2e5;
仔細分析下題,可以將兩次操作理解為刪除兩個相鄰的不同的字符中左邊的那個字符(關鍵點);
如果這里能夠get到的話這個題就不難了(好吧我承認我找了題解= =)
那么這樣的話對于這整個序列中的一個字符s[i]來講:
1 如果s[i]==s[i-1]那么所有以s[i]為結尾的子串都不可能滿足條件,因為他倆相同 這樣的話就 無法刪除
s[i-1],則長度永遠不會是1
2 如果s[i]!=s[i-1]那么所有以s[i]為結尾的字串都滿足條件。
OK,我們來論證一下:首先如果s[i-2]與s[i-1]是相同的話那么我們可以刪除s[i-1]于是再次形成s[i]!=s[i-1]的情況。
2如果s[i-1]!=s[i-2];那么就可以刪除s[i-2]那么還是s[i-1]!=s[i]的情況;
綜上無論如何都會滿足s[i]!=s[i-1]的情況。故只要相鄰的滿足不同,那么所有以為s[i]的子串滿足條件
代碼如下
/*?
每日CF打卡 E.M.T!
*/
#include<stdio.h>
#include<string.h>
char s[200005];
int main(){
?? ?long long t,len,ans;
?? ?scanf("%lld",&t);
?? ?while(t--){
?? ? scanf("%lld",&len);
?? ? ans=0;
?? ? scanf("%s",s);
?? ? int i;
?? ? for(i=1;i<len;i++){
?? ? ?if(s[i]==s[i-1]) ans++;
?? ? ?else ans+=(i+1);
?? ? }?? ?
?? ?printf("%lld\n",ans+1);?? ?
?? ?}?? ?
? ?return 0;?
}
wwwww我好菜啊。。。
希望明天可以不看題解做出來。。
?
總結
以上是生活随笔為你收集整理的每日打卡 22 11 16 CF 1694B Paranoid String的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Postman访问k8s RESTf
- 下一篇: ERROR in xxx.js from