Queries for Number of Palindromes (区间DP)
2017-08-09 20:14
555 查看
[b]Queries for Number of Palindromes[/b]
time limit per test
5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There also are q queries, each query is described by two integers li, ri (1 ≤ li ≤ ri ≤ |s|). The answer to the query is the number of substrings of string s[li... ri], which are palindromes.
String s[l... r] = slsl + 1... sr (1 ≤ l ≤ r ≤ |s|) is a substring of string s = s1s2... s|s|.
String t is called a palindrome, if it reads the same from left to right and from right to left. Formally, if t = t1t2... t|t| = t|t|t|t| - 1... t1.
Input
The first line contains string s (1 ≤ |s| ≤ 5000). The second line contains a single integer q (1 ≤ q ≤ 106) — the number of queries. Next qlines contain the queries. The i-th of these lines contains two space-separated integers li, ri (1 ≤ li ≤ ri ≤ |s|) — the description of the i-th query.
It is guaranteed that the given string consists only of lowercase English letters.
Output
Print q integers — the answers to the queries. Print the answers in the order, in which the queries are given in the input. Separate the printed numbers by whitespaces.
Examples
input
output
Note
Consider the fourth query in the first test case. String s[4... 6] = «aba». Its palindrome substrings are: «a», «b», «a», «aba».
【题意】给你一个字符串,Q次询问,每次给出一个区间问这个区间内有多少个回文字符串。
【分析】ispal[i][j]表示字符串从 i 到 j 这一段是否为回文,若是,则为1。不难得到初始化时ispal[i][i] = 1。那么,对于长度为len的字符串,判断它是否为回文,则有ispal[i][i+len-1] = ispal[i+1][i+len-2]&&str[i]==str[i+len-1];同时ispal[i][i-1]要也要初始化为1,因为当len=2时,ispal[i+1][i+len-2] = ispal[i+1][i],需要拿来计算。
dp[i][j]表示从 i 到 j 包含的回文串的个数,同样的,初始化dp[i][i] = 1。计数时有:
dp[i][i+len-1] = dp[i][i+len-2]+dp[i+1][i+len-1]-dp[i+1][i+len-2]+ispal[i][i+len-1];然后O(n^2)把每个区间的结果计算出来,对于询问s到e,直接输出dp[s][e]即可。
time limit per test
5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There also are q queries, each query is described by two integers li, ri (1 ≤ li ≤ ri ≤ |s|). The answer to the query is the number of substrings of string s[li... ri], which are palindromes.
String s[l... r] = slsl + 1... sr (1 ≤ l ≤ r ≤ |s|) is a substring of string s = s1s2... s|s|.
String t is called a palindrome, if it reads the same from left to right and from right to left. Formally, if t = t1t2... t|t| = t|t|t|t| - 1... t1.
Input
The first line contains string s (1 ≤ |s| ≤ 5000). The second line contains a single integer q (1 ≤ q ≤ 106) — the number of queries. Next qlines contain the queries. The i-th of these lines contains two space-separated integers li, ri (1 ≤ li ≤ ri ≤ |s|) — the description of the i-th query.
It is guaranteed that the given string consists only of lowercase English letters.
Output
Print q integers — the answers to the queries. Print the answers in the order, in which the queries are given in the input. Separate the printed numbers by whitespaces.
Examples
input
caaaba 5 1 1 1 4 2 3 4 6 4 5
output
1 7 3 4 2
Note
Consider the fourth query in the first test case. String s[4... 6] = «aba». Its palindrome substrings are: «a», «b», «a», «aba».
【题意】给你一个字符串,Q次询问,每次给出一个区间问这个区间内有多少个回文字符串。
【分析】ispal[i][j]表示字符串从 i 到 j 这一段是否为回文,若是,则为1。不难得到初始化时ispal[i][i] = 1。那么,对于长度为len的字符串,判断它是否为回文,则有ispal[i][i+len-1] = ispal[i+1][i+len-2]&&str[i]==str[i+len-1];同时ispal[i][i-1]要也要初始化为1,因为当len=2时,ispal[i+1][i+len-2] = ispal[i+1][i],需要拿来计算。
dp[i][j]表示从 i 到 j 包含的回文串的个数,同样的,初始化dp[i][i] = 1。计数时有:
dp[i][i+len-1] = dp[i][i+len-2]+dp[i+1][i+len-1]-dp[i+1][i+len-2]+ispal[i][i+len-1];然后O(n^2)把每个区间的结果计算出来,对于询问s到e,直接输出dp[s][e]即可。
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define mp make_pair #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 5e3+50;; const int M = 160009; const int mod = 1e9+7; const double pi= acos(-1.0); typedef pair<int,int>pii; int n; char str ; int ispal ,dp ; int main(){ scanf("%s",str+1); int len=strlen(str+1); for(int i=1;i<=len;i++)ispal[i][i]=ispal[i][i-1]=dp[i][i]=1; for(int l=2;l<=len;l++){ for(int i=1;i+l-1<=len;i++){ ispal[i][i+l-1]=ispal[i+1][i+l-2]&(str[i]==str[i+l-1]); } } for(int l=2;l<=len;l++){ for(int i=1;i+l-1<=len;i++){ dp[i][i+l-1]=dp[i][i+l-2]+dp[i+1][i+l-1]-dp[i+1][i+l-2]+ispal[i][i+l-1]; } } scanf("%d",&n); while(n--){ int l,r; scanf("%d%d",&l,&r); printf("%d\n",dp[l][r]); } return 0; }
相关文章推荐
- CodeForces245H - Queries for Number of Palindromes(区间dp)
- codeforces Queries for Number of Palindromes 区间dp
- CF245H:Queries for Number of Palindromes(dp & 区间回文串数量)
- Codeforces245H - Queries for Number of Palindromes(区间DP)
- dp --- Codeforces 245H :Queries for Number of Palindromes
- CodeForces-245H:Queries for Number of Palindromes(3-14:区间DP||回文串)
- dp --- Codeforces 245H :Queries for Number of Palindromes
- Codeforces 245H H Queries for Number of Palindromes(DP)
- Codeforces 245H H Queries for Number of Palindromes(DP)
- 245H - Queries for Number of Palindromes
- [CF245H]Queries for Number of Palindromes
- Queries for Number of Palindromes(求任意子列的回文数)
- 【CF245H】【Queries for Number of Palindromes】
- CodeForces - 245H - Queries for Number of Palindromes
- H. Queries for Number of Palindromes
- 【CF245H】Queries for Number of Palindromes(回文树)
- 【CF245H】Queries for Number of Palindromes(回文树)
- 逗比的坑——for (int i = 0; gc_handDataOutput->QueryNumberOfHands(); ++i)
- tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
- The number of points is less than required for feature