思路:暴力搜,用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: 回文字符序列的更多相关文章

  1. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  2. hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

    题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...

  3. hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)

    题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...

  4. 编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)

    #1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, , …, n.树中有n - 1条边,任意两个节点间恰好有一条 ...

  5. hihocoder #1170 机器人 &amp;&amp; 编程之美2015复赛

    题意: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小冰的N个机器人兄弟排成一列,每一个机器人有一个颜色. 如今小冰想让同一颜色的机器人聚在一起.即随意两个同颜色的 ...

  6. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  7. 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 ...

  8. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...

  9. 编程之美2.5:寻找最大的K个数

    编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array ...

随机推荐

  1. SQL Server修改主、外键和约束

    0.创建表 create table Users ( Id int, Name ), Phone ), Email ), Role_Id uniqueidentifier ) go create ta ...

  2. 数学建模美赛O奖论文总结

    Anil S. Damle Colin G. West Eric J. Benzel University of Colorado–Boulder Boulder, CO Advisor: Anne ...

  3. kolla base目录下Dockerfile.j2分析

    这几天在研究kolla制作镜像的流程,记录下对kolla项目中base目录Dockerfile.j2阅读过程.本质上base目录下的Dockerfile.j2文件,对是yum 源的一些配置,从而使制作 ...

  4. (linux)修改MySQL密码方法

    1,在/etc/my.cnf末尾  加入skip-grant-tables,保存,跳过身份验证. 2,重启MySql,使刚才修改的配置生效. 3,终端输入mysql,然后再输入use mysql; 4 ...

  5. svg动画 animate

    最近使用到svg的动画animate,简单总结下animate的主要属性: 1.定义:SVG 的animate 动画元素放在形状元素的内部,用来定义一个元素的某个属性如何踩着时点改变.在指定持续时间里 ...

  6. ALSA声音编程

    1. ALSA设备驱动将ALSA设备描述分为四层,从上到下为: default default:0 plughw:0,0 hw:0,0 不同的层次,对设备的控制权限不同,比如hardware para ...

  7. python urllib2介绍

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...

  8. C. Increasing by Modulo

    给定n个模m的数字 可以选择k个数字进行操作,操作时对该数字进行+1模m 求解最少多少次操作可以使得该数列变成单调不下降序列 实际上就是二分操作数目,其中操作数目肯定不会超过m 然后我们将左右边界变成 ...

  9. JS模块

    本文主要内容翻译自<Exploring ES6-upgrade to the next version of javascript> 模块系统 定义模块接口,通过接口 隐藏模块的内部实现, ...

  10. Web攻击技术---OWASP top

    整理OWASP top 10 部分内容,方便日后查看.想深入了解的,请移步参考中的网站. OWASP Top 10 注入 将不受信任的数据作为命令或者查询的一部分发送到解析器时,会发生诸如SQL注入. ...