【dp】【codeforces】 451D Count Good Substrings
2016-04-13 20:47
525 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=52105
一个只包含a和b的字符串, 问它有几个长度为偶数和长度为奇数的“压缩回文串”
压缩的概念是相邻的相同字符压缩成一个字符
串经过压缩一定满足如下形式 ……ababab……
这样只要两端的字符相同则中间一定是回文的
因此对于一个a它作为左端点形成的回文串个数就等于它右边的a的个数
那么长度是奇数还是偶数呢,可以这么判断:
如果a在奇数位置上和它匹配的a也在奇数位置上,那么形成的回文串就是奇数长度的,要不就是偶数长度的
b同理
因此统计一个字符的右边和它相同的字符在奇数位置和偶数位置的有几个,然后通过计算就可以得到结果
注意最后的结果大于int,使用long long
一个只包含a和b的字符串, 问它有几个长度为偶数和长度为奇数的“压缩回文串”
压缩的概念是相邻的相同字符压缩成一个字符
串经过压缩一定满足如下形式 ……ababab……
这样只要两端的字符相同则中间一定是回文的
因此对于一个a它作为左端点形成的回文串个数就等于它右边的a的个数
那么长度是奇数还是偶数呢,可以这么判断:
如果a在奇数位置上和它匹配的a也在奇数位置上,那么形成的回文串就是奇数长度的,要不就是偶数长度的
b同理
因此统计一个字符的右边和它相同的字符在奇数位置和偶数位置的有几个,然后通过计算就可以得到结果
注意最后的结果大于int,使用long long
#include<bits/stdc++.h> using namespace std; typedef long long ll; char str[100005]; int odd[2], even[2], len; ll sumodd, sumeven; int main(){ while(~scanf("%s", str+1)){ sumodd = 0, sumeven = 0; memset(odd, 0, sizeof(odd)); memset(even, 0, sizeof(even)); len = strlen(str+1); for(int i = 1; i <= len; i++){ int pos = str[i]-'a'; if(i%2){ odd[pos]++; sumodd += odd[pos]; sumeven += even[pos]; } else{ even[pos]++; sumodd += even[pos]; sumeven += odd[pos]; } } printf("%I64d %I64d\n", sumeven, sumodd); } return 0; }
相关文章推荐
- 如何在浏览器中debug-谷歌浏览器(Google Chrome )
- lingo
- USACO2016 January Gold Angry Cows
- Go-Agent部署与FQ教程-Windows版
- 【Leetcode】:Single Number II问题 in Go语言
- protobuf 最新版本编译 Google Protobuf 3.0.1
- 简单实现Google play 横向RecyclerListView效果
- 《A Tutorial on Automated Text Categorisation》NOTE
- LeetCode Algorithms #102 <Binary Tree Level Order Traversal>
- 一、go语言基础流程控制,语法,反射特性--go语言笔记
- Django Admin - 将model的Add(增加功能去掉)
- django定期执行任务
- 编写一个go gRPC的服务
- Got error: 1556: You can't use locks with log tables
- google hash表之dense_hash
- 从搜索结果中进入Product面包屑也包含Category Path
- Go1.6与JVM CMS的垃圾回收对比
- GoldenGate之目录详解
- Why is try {…} finally {…} good; try {…} catch{} bad?
- VNC Viewer远程登录服务器时 点了logout