Dili_iiii

编码全要靠底力

【字符串/回文子串个数】大战幻想珠

题目描述

烤乐滋又生日了!占虽然过去了整整一年,可他还是对去年发生的炸弹事件充满阴影。于是决定不让来访的好友们自带礼物。
但生日怎么能没有礼物昵?烤乐滋决定拿出他的幻想珠串来.幻想珠是一颗上面写着小写英文字母的珠子。有些珠子自带神奇的魔力,上面写着一个”?”,就表示这颗珠子可以表示任意一个小写英文字母。幻想珠串是长长的一个个幻想珠首尾相连组成的串。烤乐滋决定,让每个朋友从这个珠串中挑选一段连续的串送给自己。
烤乐滋很喜欢回文(从前往后和从后往前读一样),于是他希望朋友挑选出的串都是回文的。比如”ababa”和” acd?a”都是回文的,而”a?d?c”就不是回文的。
烤乐滋想要知道,整个幻想珠串中一共能挑选出多少个回文的子串。两个位置不同内容相同的子串我们也视作是不同的子串。

 

输入

第一行一个数n(n≤3000),表示幻想珠串的长度。
第二行一个有n 个字符.只可能是小写字母或”?”。字符之间没有多余空格。

 

输出

一行一个数表示答案。
 
 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
char mp[10005];
int n,ant;
void work()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;i+j<n&&i-j>=0;j++)
        {
            if(mp[i+j]==mp[i-j])
                ant++;
            else if(mp[i+j]=='?'||mp[i-j]=='?')
                ant++;
            else
                break;
        }
        for(int j=0;i+j<n&&i-j-1>=0;j++)
        {
            if(mp[i+j]==mp[i-j-1])
                ant++;
            else if(mp[i+j]=='?'||mp[i-j-1]=='?')
                ant++;
            else
                break;
        }
    }
}
int main()
{
    scanf("%d",&n);
    scanf("%s",mp);
    work();
    printf("%d\n",ant);
    return 0;
}

 

posted @ 2019-01-14 16:12  Dili_iiii  阅读(355)  评论(0编辑  收藏  举报