编程之美2015 资格赛 hihocoder 题目2: 回文字符序列
思路:暴力搜,用BFS的方式,生成每一种可能,再对每一种可能进行判断是否回文,进行统计。严重超时!计算一个25个字符的,大概要20多秒!
#include <iostream>
#include <deque>
#include <string>
#include <stdio.h>
#include <cstring>
using namespace std; deque<string> a; bool isP(string &s )
{
string::iterator it1=s.begin();
string::iterator it2=s.end();
while( it1!=it2 && it1!=--it2 )
{
if( *it1!=*it2 )
return false;
it1++;
}
return true;
} unsigned long long count() //判断回文,注意取余
{
unsigned long long cnt=;
string tmp="";
a.pop_front();
while( !a.empty() )
{
tmp =a.front(); if( tmp.size()== )
cnt++; //单个的情况
else if( isP(tmp)==true )
cnt++; a.pop_front();
if(cnt> )
cnt %= ;
}
return cnt;
} int betree(string &s, int len) //生成树
{
string tmp="";
a.push_back(tmp); int i, j, limit =a.size() ; for(i=; i<len; i++)
{
for(j=; j<limit; j++)
{
a.push_back(a.front()); //不装第i个
a.push_back(a.front()+s[i]); //装第i个
a.pop_front();
}
limit =a.size();
}
return ;
} int main()
{
//freopen("input.txt","r",stdin);
int t, j=;
string s;
cin>>t;
while(t--)
{
a.clear();
s="";
cin>>s;
betree(s, s.size());
cout<<"Case #"<< ++j<< ": "<< count()<<endl;
}
return ;
}
BFS超时
另外的思路:肯定可以用DP。参考了别人的代码思路。添加了个SAO函数来记录当前字符在前面所出现的位置,若没出现过则置-1,这样可少扫很多次。
#include <iostream>
#include <string>
#include <stdio.h>
#include <memory>
#include <string.h>
using namespace std;
long long map[][];
int pos[];
int tmp[];
int len;
string input;
void cal(int start ,int end)
{
if(start==end) //自己到自己,即单个字符的情况,是回文,也就是它自己
{
map[start][end]=;
return ;
}
if(end-start==) //两个字符的情况,判断两者是否相同。若相同,则有3个,否则,只有两个
{
if(input[start]==input[end])
map[start][end]=;
else
map[start][end]=;
return ;
}
map[start][end]+=map[start][end-]+; //先加一个,也就是他自己单独作为回文串。 /*
for(int i=end-1; i>=start; i--)
{
if(input[i]==input[end]) //考虑end之前的每一个,对于第i个,如果和end相同,那么结果就是i到end之间的串的回文串的最大数量+1
map[start][end] += map[i+1][end-1]+1; //状态方程
}
*/
int temp = pos[end];
while( temp>- && temp>=start )
{
map[start][end] += map[temp+][end-]+; //状态方程
temp = pos[temp];
} map[start][end]%=;
} void sao()
{
for(int i=; i<; i++)
pos[i] = -; // -1说明第1个字符的前面并没有与其相同的字符。
for(int i=; i<; i++) //记录最近一个字符出现的位置
tmp[i] = -; for(int i=; i<len; i++)
{
pos[i] = tmp[input[i]];
tmp[input[i]] = i; //更新字符input[i]最新出现的位置
}
} int main()
{
//freopen("input.txt","r",stdin);
int T;
int Case=;
cin>>T; while(T--)
{
memset(map,,sizeof(map)); cin>>input;
len = input.size();
sao();
for(int i=; i<input.size(); i++) //从左往右扫
{
for(int j=i; j>=; j--) //从第i个开始往左扫,才能保证在计算大问题之前,所要依靠的小问题已经被解决
{
cal(j,i);
}
}
cout<<"Case #"<<++Case<<": "<<map[][input.size()-]<<endl;
} }
AC了
编程之美2015 资格赛 hihocoder 题目2: 回文字符序列的更多相关文章
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
- hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...
- hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...
- 编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)
#1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, , …, n.树中有n - 1条边,任意两个节点间恰好有一条 ...
- hihocoder #1170 机器人 && 编程之美2015复赛
题意: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小冰的N个机器人兄弟排成一列,每一个机器人有一个颜色. 如今小冰想让同一颜色的机器人聚在一起.即随意两个同颜色的 ...
- 编程之美2014挑战赛 复赛 Codehunt平台试题答案
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)
题目链接 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...
- 编程之美2.5:寻找最大的K个数
编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array ...
随机推荐
- 项目:IT资源共享资源(登录前端)<1>
公众号技术标签 小程序 PHP 源码 项目 IT资源共享项目 这是前年自己收集了一些网络开发资源,上传到百度网盘,提供积分兑换.上线后用户在两个月内达到3427人,其中用java,PHP,前端,Pyt ...
- 使用urllib获取一个网页内所有a标签的href属性
import re, urllib.request, urllib.parse, urllib.error page = input('Enter - ') fhand = urllib.reques ...
- sqllocaldb 的使用记录
sql脚本是一个文件大约也就几MB,要是有一种文件存储数据就好了,后来了解到了sqllocaldb,但是没有深入研究大概知道有这么一个东西.这次翻出来还是自家小姑姑要做winfrom但是苦于sqlse ...
- 总结工作中用到的ES6语法,方便工作中查看,也总结一下经验
1.模板字符串: 表现形式:${} 举例子: import axios from 'axios'; let base = 'https://www.baidu.com/home/msg/data/pe ...
- SharePoint2016 母版页引用样式和脚本路径无效
直接引用16目录(/_layouts/16/)会导致页面找不到文件,必须将16目录改为15目录(/_layouts/15/),估计是内部机制还没有更新,这个坑不知道要多久才会填上=,=
- BZOJ 4260 Codechef REBXOR 01trie
好题...开阔思路 把每个前缀异或和依次插入$01trie$,插之前找一个最优的(就是从高位向低位贪心,尽量走相反方向)看看能不能更新答案,此时相当于找到了区间右端点不超过某个点$r$的最大或和$f[ ...
- 73th LeetCode Weekly Contest Rotated Digits
X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...
- Hystrix使用小结
通过服务熔断实现服务降级 @HystrixCommand(fallbackMethod = "reliable", commandProperties = { @HystrixPr ...
- Domain Model
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的 ...
- 练习十七:python辨别数据类型
关于python辨别数据类型可以用python type()方法,那么想要查看一串字符中每项类型,并逐一输出要怎么处理?看下我是怎么处理的 习题要求:输入一行字符,分别统计其中英文字母.数字.空格.和 ...