Reverse and Compare(DP)

Reverse and Compare



Time limit : 2sec / Memory limit : 256MB

Score : 500 points

Problem Statement

You have a string A=A1A2…An consisting of lowercase English letters.

You can choose any two indices i and j such that 1≤ijn and reverse substring AiAi+1…Aj.

You can perform this operation at most once.

How many different strings can you obtain?

Constraints

  • 1≤|A|≤200,000
  • A consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

A

Output

Print the number of different strings you can obtain by reversing any substring in A at most once.


Sample Input 1

Copy

aatt

Sample Output 1

Copy

5

You can obtain aatt (don‘t do anything), atat (reverse A[2..3]), atta (reverse A[2..4]), ttaa (reverse A[1..4]) and taat (reverse A[1..3]).


Sample Input 2

Copy

xxxxxxxxxx

Sample Output 2

Copy

1

Whatever substring you reverse, you‘ll always get xxxxxxxxxx.


Sample Input 3

Copy

abracadabra

Sample Output 3

Copy

44

//很简单的一道DP,但是难想到,想到极其简单dp[i]为前 i 个数的不同串数的话,dp[i] = dp[i-1] + sum[ str[j]!=str[i] ] (1<=j<i) (前面不等于字符 i 的所有字符的个数)因为,只要不同,就能reverse[j,i]出一个新串,相同时,reverse[j+1,i-1]是和前相同的,算过了此题,容易想到回文串什么的,回文串就是个坑,根本不对,跳进去就很难出来了

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 #define LL long long
 6 #define MX 200500
 7
 8 LL dp[MX];
 9 LL num[26];
10 char s[MX];
11
12 int main()
13 {
14     scanf("%s",s+1);
15     int len = strlen(s+1);
16     dp[0]=1;
17     for (int i=1;i<=len;i++)
18     {
19         dp[i]=dp[i-1];
20         for (int j=0;j<26;j++)
21         {
22             if (s[i]==‘a‘+j) continue;
23             dp[i] += num[j];
24         }
25         num[ s[i]-‘a‘ ]++;
26     }
27     printf("%lld\n",dp[len]);
28     return 0;
29 }

				
时间: 2024-10-12 00:34:39

Reverse and Compare(DP)的相关文章

Leetcode第1题至第10题 思路分析及C++实现

笔者按照目录刷题,对于每一道题,力争使用效率最高(时间复杂度最低)的算法,并全部通过C++代码实现AC.(文中计算的复杂度都是最坏情况复杂度) 因为考虑到大部分读者已经在Leetcode浏览过题目了,所以每道题都按照 解题思路 -> 实现代码 -> 问题描述 的顺序进行讲解. (笔者目前已刷 40 题,已更新解法 10 题,最近一段时间会频繁更新)可以点击下方链接,直达gitbook: https://codernie.gitbooks.io/leetcode-solutions/conten

B计划 第三周(开学前一周)

有事一周的开始,上周确实懈怠了不少.这周继续--(这周的400道题解报告,每道题目名字都会嵌入一个超链接) 1.reverse and compare. 字符串分析题.当a[i] = a[j], i < j时,翻转(i, j)和翻转(i + 1, j - 1)的到一样的效果. 2.

高程第五章(引用类型)

引用类型是一种数据结构,它被称为类,但是这种称呼并不妥当,不具备传统的面向对象语言所支持的类和接口等基本结构. Array.isArray()最终确定某个值到底是不是数组. var color = ['red','blue','green']; console.log(color.toString());//red,blue,green console.log(color.valueOf());//[ 'red', 'blue', 'green' ] console.log(color.toLo

[cc150] check palindrome of a singly linked list

Problem: Implement a function to check if a singly linked list is a palindrome. 思路: 最简单的方法是 Reverse and compare. 另外一种非常经典的办法是用 Recursive 的思路,把一个list看成这种形式: 0 ( 1 ( 2 ( 3 ) 2 ) 1 ) 0 0 ( 1 ( 2 ( 3 3 ) 2 ) 1 ) 0 CC150里面给出的Code,非常简洁,贴在下面: length == 1 对应

信息学奥赛一本通 5.1 区间类动态规划

石子合并[loj 10147] /* dp[i][j]=max or min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]) i<=k<j */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int re

树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处理的. 这个树形dp是从底往根部来递推,所以每一个点,都是由它的根节点来递推的. 如果一个根节点的子节点放了东西,那么这个根节点就可以有选择,但是如果没有放东西,那么这个根节点就必须放东西. E - Cell Phone Network POJ - 3659 题目大意:给你一棵树,让你用最小的东西来覆盖所有

CF1234F Yet Another Substring Reverse (状压dp)

首先我们发现,因为可以在任意地方翻转,所以最后的答案就是一个合法子串和他的补集的子集中个数和最大的那个 因此我们先枚举每一个合法状态,记录他的合法个数有几个. 然后我们从头枚举每一个状态,计算状态的子集中的最大个数. 这样我们最后只要枚举状态和补集,就能计算出真正的答案了 #include<iostream> #include<vector> #include<cstdio> #include<string> #include<cstring>

Codeforces1234F. Yet Another Substring Reverse(状压dp)

题目链接:传送门 思路: 由于只能翻转一次子串,就相当于找出两个不连续的子串,把在后面的一个子串翻转过来,和第一个子串拼接. 因为题目仅要求子串中的字符不重复,所以字符的先后顺序无关,翻转的操作就相当于: 选出两个不连续的子串,且他们没有相同的字符,两个子串的长度之和就是答案的一种可能. 题目中反复强调,给出的字符串只有前20个字母[a, t],考虑到$2^{20} = 10^{6}, 2^{26} = 6*10^{7}$,显然在疯狂暗示:要用状压来做这题. 所以考虑二进制状压字符集合. 一个朴

DP单调队列--斜率优化P3195

题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa