思路:暴力搜,用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. App集成极光推送开发流程[关键步骤]

    1.客户端集成SDK 1.1初始化 JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 JPushInterface.init(this); / ...

  2. 从 .NET Framework到 .NET Core

    参考资料: https://docs.microsoft.com/zh-cn/dotnet/core/porting/ https://docs.microsoft.com/zh-cn/aspnet/ ...

  3. Deep Image Matting

    论文地址:https://arxiv.org/abs/1703.03872 TF复现地址:https://github.com/Joker316701882/Deep-Image-Matting 领域 ...

  4. PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)

    1. 首先要得到该数据库中有哪些表,所用函数 mysql_list_tables(),然后可以将获取的所有表名存到一个数组.----------------该函数由于被弃用   用show table ...

  5. CF 983B XOR-pyramid(区间dp,异或)

    CF 983B XOR-pyramid(区间dp,异或) 若有一个长度为m的数组b,定义函数f为: \(f(b) = \begin{cases} b[1] & \quad \text{if } ...

  6. 小程序组件交互 -- 传入js

    1.父组件(wxml页面)向子组件传递 在子组件中定义需要传入的属性 properties: { count: { type: Number, value: 0, observer:function( ...

  7. kvm磁盘io优化以及性能测试以及与物理机对比

    ubuntu下kvm的磁盘io性能优化步骤 1.virsh shutdown wcltest2 2.virsh edit wcltest2 <driver name='qemu' type='q ...

  8. python之Selenium库的使用

    一  什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并 ...

  9. AngularJs1.X学习--路由

    [三种使用说明:] $stateProvider.state('station.printQRCode', { //params: { 'parentOfficeId': null }, //一次性参 ...

  10. jap的教程

    第一个资料:   https://wenku.baidu.com/view/5ca6ce6a1eb91a37f1115cee.html 第二个资料 :http://www.yiibai.com/jpa ...