1. 程式人生 > >20171005校內訓練

20171005校內訓練

images tdi 每一個 com 滿足 ring closed 當前 else

技術分享

技術分享

給出一個美麗串,叫你找到下一個比它字典序大的回文串

我們考慮貪心的從後往前替換每一個字母。即對於最後一位(設字母為a),我們把它替換成從a到p的每個字母,如果都不滿足美麗串的條件,那麽把前一位字母從‘a‘替換到p。

問題來了,判斷回文串需要O(n)的時間。

分析條件:沒有回文串其實就是每個字符不與前兩個字符相同。

因為題目給出的是一個美麗串,所以對於當前字符,如果存在大於3長度的回文串,那麽這個回文串的字串也一定回文,與題意說的美麗串不符

如圖,若替換1號後會形成1234這個回文串,那麽2號和3號一定相等,但是原串是個美麗串,即2,3號必不相等,矛盾

技術分享

然後貪心找出了最高位的數字後,從後往前貪心構造每一位。

即從字典序從小到大選擇每一位上填的數,如果可以,則繼續下一位

技術分享
#include<iostream>
#include<cstdio>
using namespace std;
int n,p;char c[100001];
bool check(int i)
{
    if(i==0)return 0;
    if(i==1)return c[i]==c[i-1];
    if(c[i]==c[i-1]||c[i]==c[i-2])return 1;
    return 0;
}
void up(int i)
{
    for(;i<n;i++)
    {
        
for(int j=1;j<=p;j++) { c[i]=a+j-1; if(!check(i))break; } } } int main() { //freopen("string.in","r",stdin);freopen("string.out","w",stdout); scanf("%d%d%s",&n,&p,c);bool fir=0; int i; for(i=n-1;i>=0;i--) { while(fir==0
||(c[i]<=a+p-1&&check(i))){c[i]++;fir=1;} if(c[i]<=a+p-1){up(i+1);break;} else fir=0; } if(i==-1)return 0*puts("NO"); for(int i=0;i<n;i++)printf("%c",c[i]); return 0; }
View Code

技術分享

20171005校內訓練