回文密码

T2.回文密码(password.cpp/pas/in/out)

时间限制:1s

空间限制:256MB

伊利斯.逐星:多亏了你的相助,我们通过了第一层。那些蜘蛛真是另令人作呕。现在,我们来到了城堡二层,但是……恐怕又要麻烦你了。

布莱恩.铜须:你猜猜我们看到了什么?乌瑟尔!我的好朋友,他的尸体就这么被克尔苏加德转化成为了亡灵!还被冻在冰块里!我一定要找到这个可恶的死灵法师,把他砸成肉饼!

芬利.莫格顿:%^&##@#%^

(旁边还有克尔苏加德留给我们的谜题!上面写着……)

雷诺.杰克逊:糟了!我们必须在一秒内解开密码,否则……乌瑟尔将会从冰雕里……解放出来……将我们杀掉。

题目描述:

他们又遇到麻烦了,现在需要你帮助他们解开克尔苏加德的密码。

有这样一串数字和若干次询问,对于每次询问,求出该询问区间的最长回文子串长度,所有的结果的组合就是通往下一层的密码

数据输入:

第一行n表示数字串长度,第二行一串长度为n的数字串(数字范围0~9)。第三行m表示询问的次数,第4~4+m-1行每行一组Li,Ri表示询问区间。

数据输出:

m行,每行对应一个询问。

输入样例:

10

1 2 3 4 5 5 4 3 2 1

2

1 10

2 9

输出样例:

10

8

数据范围:

0<n<=100000,0<m<=1000000,|Ri-Li|<=20

前30%,n,m<=200;

30%~60%,n,m<=2000;

2014级学长老爷子(冯俊杰)出的题,质量还是相当高的,是一个dp,f[i][j]表示从i开始长度为j的序列中最长的回文序列的长度,转移方程为

if(f[i+1][j-2]==j-2&&a[i]==a[i+j-1])

f[i][j]=j;

else

f[i][j]=max(f[i+1][j-1],f[i][j-1]);

长度是外循环。

#include<bits/stdc++.h>
using namespace std;

int n,m;
int a[201000];
int f[201000][210];

void in(int &x)
{
    char c=getchar();x=0;
    while(c<‘0‘||c>‘9‘)c=getchar();
    while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
}

void out(int x)
{
    if(x>9) out(x/10);
    putchar(x%10+‘0‘);
}

int main()
{

  freopen("password.in","r",stdin);
  freopen("password.out","w",stdout);
  cin>>n;
  for(int i=1;i<=n;i++)
      in(a[i]);
  for(int i=1;i<=n;i++)
      f[i][1]=1;

 for(int j=2;j<=n&&j<=200;j++)
  for(int i=1;i+j-1<=n;i++)
    {
        if(f[i+1][j-2]==j-2&&a[i]==a[i+j-1])
          f[i][j]=j;
        else
          f[i][j]=max(f[i+1][j-1],f[i][j-1]);
    }
    in(m);
    int x,y;
    for(int i=1;i<=m;i++)
      {
          in(x),in(y);
          out(f[x][y-x+1]);
          putchar(‘\n‘);
      }
  return 0;
}
时间: 2024-10-10 01:44:12

回文密码的相关文章

37:密码截取(回文串manacher算法)

题目描述:Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 .因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码

字符串运用-密码截取,字符串中的最长的回文串

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 .因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗? 1

HihoCOder1323 : 回文字符串(区间DP)

回文字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串? 一次操作可以在任意位置插入一个字符,或者删除任意一个字符,或者把任意一个字符修改成任意其他字符. 输入 字符串 S.S 的长度不超过100, 只包含'A'-'Z'. 输出 最少的修改次数. 样例输入 ABAD 样例输出 1 区间DP水题,见铺垫:密码脱落. #include<cstdio> #include<cstdlib

16-最少回文数组

Splits the string 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Hrdv is interested in a string,especially the palindrome string.So he wants some palindrome string. A sequence of characters is a palindrome if it is the same written forwards and backwards. Fo

最少回文串--牛客网(秋招备战专场三模)-C++方向

题目描述:一个字符串从左向右和从右向左读都完全一样则是回文串,给定一个字符串,问该字符串中的字符所能组成的最少的回文串的个数为多少 解题思路:如果一个字符出现的次数为偶数,则必能组成回文串,如果一个字符出现奇数次,只能自己组成回文串,题目中问最少的回文串数目,即求出现次数为奇数次的字符个数即可,定义a存储每个字符出现的次数,统计出现奇数次的字符的个数,即为输出 1 #include <iostream> 2 #include <string> 3 using namespace s

回文判断

一个整形数是否是回文 also leetcode 9 Palindrome Number要求空间复杂度O(1)按位判断一般是/和%的游戏,首先取首位 a/h (h是最接近a的10的次方,比如12321,h预计算出是10000), 再取末位a%10; 比较首位和末位是否相等,不等就返回false; 如图: 然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232. a = a % h; // 去掉首 a = a /10; //去掉尾 h = 100; // 因为已经去掉了两位 如

判断一个数是否为回文数

#include <stdio.h> int is_palindromic(int num) {  char _old = num;  char _new = 0;  while (num)  {   _new = _new * 10 + (num % 10);   num = num / 10;  }  if (_new == _old)  {   return 1;  }  else  {   return 0;  } } int main() {  int num = 0;  scanf

判断一个字符串是否为回文字符串

#include <stdio.h> #include <assert.h> #include <string.h> int is_pal_str(const char *p) {  assert(p);  int len = strlen(p);  const char *start = p;  const char *end = p+len - 1;  while (start < end)  {   if (*start == *end)   {    st

LeetCode 9 Palindrome Number (回文数)

翻译 确定一个整数是否是回文数.不能使用额外的空间. 一些提示: 负数能不能是回文数呢?(比如,-1) 如果你想将整数转换成字符串,但要注意限制使用额外的空间. 你也可以考虑翻转一个整数. 然而,如果你已经解决了问题"翻转整数(译者注:LeetCode 第七题), 那么你应该知道翻转的整数可能会造成溢出. 你将如何处理这种情况? 这是一个解决该问题更通用的方法. 原文 Determine whether an integer is a palindrome. Do this without ex