20171005校內訓練
阿新 • • 發佈:2017-10-08
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++) {View Codefor(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; }
20171005校內訓練