题目描述
PIPI要考考你对回文串的掌握了~
现在有一个长度为n的字符串S,PIPI对此有q个询问,每次询问S中某个连续区间(从1开始)是否构成回文串,若是输出"yes",否则输出”no"。
输入
多组数据。
第一行为两个个整数n,q(1<=n<=1000,1<=q<=100000)
第二行为一个长为n的字符串S。
接下来q行,每行两个整数l,r,表示询问S中区间[l,r]是否构成回文串。保证l<=r且合法。
输出
对于每个询问输出占一行,输出“yes"或者”no"。
样例输入
5 3
abcba
1 5
2 4
3 4
样例输出
yes
yes
no
#include <bits/stdc++.h>
using namespace std;
int n,q;
char s1[1005];
int dp[1005][1005];
int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
memset(dp,0,sizeof(dp)); ///多组输入清空数组
scanf("%s",s1+1);
int len=strlen(s1+1);
for(int i=1; i<=len; i++) ///初始化边界状态
{
dp[i][i]=1;
if(i<=len-1)
{
if(s1[i]==s1[i+1]) ///注意初始化时要加上距离为1时的状态,否则下面执行dp[j+1][k-1]时会出错
dp[i][i+1]=1;
}
}
for(int i=3; i<=len; i++)
{
for(int j=1; j+i-1<=len; j++)
{
int k=j+i-1;
if(s1[j]==s1[k]&&dp[j+1][k-1]==1)
dp[j][k]=1;
}
}
int l,r;
while(q--)
{
scanf("%d %d",&l,&r);
if(dp[l][r])
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}