ホームページ  >  記事  >  ウェブフロントエンド  >  Codeforces Round #265 (Div. 2) C. 回文なしで文字列を構築する_html/css_WEB-ITnose

Codeforces Round #265 (Div. 2) C. 回文なしで文字列を構築する_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:55:361193ブラウズ

http://codeforces.com/contest/465/problem/C

给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,且串中字母在一定范围内,并且说同样不存在长度大于2的回文子串。


直接去递归构造即可,从最后一位开始,每次只要判断是否子串中含有回文串,其实仔细想想只要考虑是否存在一个字符和前两个字符中的一个相同即可。不卡时限,裸的判断都能过

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <queue>#include <vector>#include<set>#include <iostream>#include <algorithm>using namespace std;#define RD(x) scanf("%d",&x)#define RD2(x,y) scanf("%d%d",&x,&y)#define clr0(x) memset(x,0,sizeof(x))typedef long long LL;int p,n;char ch[1005],ans[1005];//int fun(int low, int high, char *str, int length)//{//    if (length == 0 || length == 1)//        return    1;//    if (str[low] != str[high])//        return    0;//    return fun(low+1, high-1, str, length-2);//}int fun(int low, int high, char *str, int length){    if (length == 0 || length == 1)        return  false;    if(str[low] == str[low+1])        return  true;    for(int i = low + 2;i <= high;++i){        if(str[i] == str[i-1] || str[i] == str[i-2])            return true;    }    return false;}bool find(int x,bool big){    if(x == n){        if(strcmp(ch,ans) == 0)            return false;        return true;    }    for(char i = big?'a':ch[x];i < p+'a';++i){        ans[x] = i;        int j;        if(fun(0,x,ans,x+1))    continue;//        for(j = 0;j < x;++j)//            if(fun(j,x,ans,x-j+1))//                break;//        if(j != x)  continue;        if(find(x+1,big|ans[x] > ch[x]))            return true;    }    return false;}int main() {    RD2(n,p);    scanf("%s",ch);    ans[n] = '\0';    if(find(0,0))        puts(ans);    else        puts("NO");    return 0;}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。