CodeForces 245H Queries for Number of Palindromes (区间DP)
2013-05-22 01:02
316 查看
H. Queries for Number of Palindromes
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 q lines 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.
Sample test(s)
input
output
首先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 q lines 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.
Sample test(s)
input
caaaba 5 1 1 1 4 2 3 4 6 4 5
output
1 7 3 4 2
首先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 <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define SIZE 5001 using namespace std; int ispal[SIZE][SIZE]; int dp[SIZE][SIZE]; char str[SIZE]; int Q; int main() { while(~scanf("%s",str+1)) { int len = (int)strlen(str+1); for(int i=1; i<=len; i++) { dp[i][i] = ispal[i][i] = 1; ispal[i][i-1] = 1; } for(int i=2; i<=len; i++) { for(int s=1; s+i-1 <=len; s++) { ispal[s][s+i-1] = ispal[s+1][s+i-2]&&str[s]==str[s+i-1]; dp[s][s+i-1] = dp[s][s+i-2]+dp[s+1][s+i-1]-dp[s+1][s+i-2]+ispal[s][s+i-1]; } } scanf("%d",&Q); int s,e; while(Q--) { scanf("%d%d",&s,&e); printf("%d\n",dp[s][e]); } } return 0; }
相关文章推荐
- CodeForces 149D Coloring Brackets(区间DP)
- Codeforces 758D Ability To Convert(区间DP)
- codeforces 149D Coloring Brackets 区间DP
- codeforces 607 B Zuma(区间dp)
- CodeForces - 149D Coloring Brackets[区间dp]
- CodeForces - 149D(区间DP)
- codeforces 149D - Coloring Brackets (区间dp)
- CodeForces 149D Coloring Brackets(区间DP)
- CodeForces 149D-Coloring Brackets(区间dp 的好题)
- codeforces 159D 多加二维的区间DP
- CodeForces - 1025D: Recovering BST (区间DP)
- codeforces 607B Zuma 区间dp
- CodeForces 149D Coloring Brackets(区间DP+dfs)
- CodeForces 149D 区间DP Coloring Brackets
- codeforces 149D Coloring Brackets(区间dp)
- 【记忆化搜索区间dp】CodeForces 149D Coloring Brackets
- Codeforces 607B Zuma (区间dp)
- CodeForces 547 B (区间dp)
- Codeforces_607B:Zuma(区间DP)
- Codeforces 607B Zuma 【区间dp】