【dp】【codeforces】 451D Count Good Substrings

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=52105

 

一个只包含a和b的字符串, 问它有几个长度为偶数和长度为奇数的“压缩回文串”

压缩的概念是相邻的相同字符压缩成一个字符

 

串经过压缩一定满足如下形式 ……ababab……

这样只要两端的字符相同则中间一定是回文的

因此对于一个a它作为左端点形成的回文串个数就等于它右边的a的个数

那么长度是奇数还是偶数呢,可以这么判断:

如果a在奇数位置上和它匹配的a也在奇数位置上,那么形成的回文串就是奇数长度的,要不就是偶数长度的

b同理

因此统计一个字符的右边和它相同的字符在奇数位置和偶数位置的有几个,然后通过计算就可以得到结果

注意最后的结果大于int,使用long long

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 char str[100005];
 6 int odd[2], even[2], len;
 7 ll sumodd, sumeven;
 8 
 9 int main(){
10     while(~scanf("%s", str+1)){
11         sumodd = 0, sumeven = 0;
12         memset(odd, 0, sizeof(odd));
13         memset(even, 0, sizeof(even));
14         len = strlen(str+1);
15         for(int i = 1; i <= len; i++){
16             int pos = str[i]-'a';
17             if(i%2){
18                 odd[pos]++;
19                 sumodd += odd[pos];
20                 sumeven += even[pos];
21             }
22             else{
23                 even[pos]++;
24                 sumodd += even[pos];
25                 sumeven += odd[pos];
26             }
27         }
28         printf("%I64d %I64d\n", sumeven, sumodd);
29     }
30     return 0;
31 }

 

posted @ 2016-04-13 20:47  快扶哀家去刷题  阅读(194)  评论(0编辑  收藏  举报