编程之美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 ...
随机推荐
- C#文件监控工具(对追加内容的监控并输出)
C#文件监控(对追加内容的监控并输出),适合监控某个目录下的日志文件(log),开发初衷是linux上部署在jexus部署网站后想实时输出jexus的log和自己站点的log文件(已经测试通过在mon ...
- 2019前端面试之html5
html5新增特性 语义化标签 表单新特性 视频和音频canva画布 svg画图 地理位置 为鼠标提供的拖放api webwroker storage websocker 常见块级标签 div,p,h ...
- 51nod 1154【DP】
区间DP大暴力吧?GG. dp[ i ] 为字符至 i 的最少数量. 如果[Left , Right]是回文串, dp[Right] = min(dp[ Right ] , dp[Left-1] + ...
- Codeforces570C 【简单标记】
题意: 给定一个长为n的字符串(包含小写字母和'.'),有m次操作 每次操作可以修改字符,并询问修改后有多少对相邻的'.' 思路: 标记. #include<bits/stdc++.h> ...
- Machine Learning-KNN
思路:如果一个样本在特征空间中的k个最相近的样本中大多数属于某个类别,则该样本也属于该类别: 这段话中涉及到KNN的三要素:K.距离度量.决策规则 K:KNN的算法的结果很大程度取决于K值的选择: I ...
- uoj #5. 【NOI2014】动物园
#5. [NOI2014]动物园 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的园长决定开设算法班,让 ...
- 日志记录:MySQL系列之十一
一.SQL命令历史 ~/.mysql_history 记录了在mysql中执行的命令历史 二.事务日志 transaction log:事务型存储引擎自行管理和使用 在一个事务提交后还没有存到磁盘的情 ...
- CF10D/POJ2127 LCIS解题报告
题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考 rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片 (不管了) 题目思路 LCIS模版O(n²) ...
- 利用Putty连接树莓派
解决emergency mode问题 记得上一次玩我的树莓派是做一个小型的服务器,挂载一个8GB的USB做服务器,在Windows电脑上直接进行访问.结果今天就开启不了树莓派了,总是进入emergen ...
- OpenCV3的配置(VS2015)
1:首先下载和解压到给定的目录 2:设置环境变量...\build\x64\vc14\bin 3:打开VS,新建一个项目,再添加一个代码,刚开始当然是报错的 #include<opencv2\o ...