思路:暴力搜,用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. .net core 中使用NLog

    在.net standard 2.0.3 和.net core 2.1适用.其他版本的.net 应该也可以. 1.新建一个空白解决方案,再建一个类库 2.安装NLog.Config,会生成一个配置文件 ...

  2. 【leetcode 105. 从前序与中序遍历序列构造二叉树】解题报告

    前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& preorder, int l1, int r1, vecto ...

  3. 前端编码规范 -- css篇

    合理的避免使用ID 一般情况下ID不应该被应用于样式. ID的样式不能被复用并且每个页面中你只能使用一次ID. 使用ID唯一有效的是确定网页或整个站点中的位置. 尽管如此,你应该始终考虑使用class ...

  4. The Largest Generation (25)(BFS)(PAT甲级)

    #include<bits/stdc++.h>using namespace std;int n,m,l,t;int a[1307][137][67];int vis[1307][137] ...

  5. puppet的一个Bug

    前篇文章写了使用puppet管理500多台服务器,当然只是一部分,最主要的还是puppet脚本的编写,这个我会在以后的文章中一点一点写出来. 今天要写的是puppet的一个bug,版本是puppet ...

  6. Python的自增运算与Python变量的浅析

    一.关于Python的自增运算 学了C/C++后再学习Python,不自觉地就打出了自增运算符++,但是发现Python解释器不认识,查了下资料,发现Python中没有这个运算符.这里暂时不探讨自增运 ...

  7. sql server 查询练习

    需要建的四个表: 学生表 create table Student ( Sno varchar(20) not null primary key, Sname varchar(20) not null ...

  8. JOS lab1 part2 分析

    lab1的Exercise 2就是让我们熟悉gdb的si操作,并知道BIOS的几条指令在做什么就够了,所以我们也会尽可能的去分析每一行代码. 首先进入到6.8282/lab这个目录下,输入指令make ...

  9. Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP

    有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...

  10. python学习二(文件与异常)

    Python中使用open BIF与文件交互,与for语句结合使用,一次读取一行 读取文件sketch.txt,文件内容如下: Man: Ah! (taking out his wallet and ...