https:///contest/1493/problem/C 從后往左找一個(gè)需要加大的地方,枚舉這個(gè)地方加大多少,每次都判定后面是否能湊成功即可 1 #define IO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 2 #define bug(x) cout<<#x<<" is "<<x<<endl 3 #include <bits/stdc++.h> 4 #define iter ::iterator 5 using namespace std; 6 typedef long long ll; 7 typedef pair<int,ll>P; 8 #define pb push_back 9 #define mk make_pair 10 #define se second 11 #define fi first 12 #define rs o*2+1 13 #define ls o*2 14 const ll mod=1e9+7; 15 const int N=2e5+5; 16 int T,n,k; 17 18 char s[N],t[N]; 19 20 int a[N][26],b[26]; 21 22 int check(int i,int x){ 23 int f=0,y=0; 24 for(int j=0;j<26;j++){ 25 if(j==x){ 26 b[j]=a[i-1][j]; 27 b[j]%=k; 28 b[j]=k-b[j]; 29 b[j]--; 30 if(b[j]<0){ 31 f=1; 32 break; 33 } 34 b[j]%=k; 35 y+=b[j]; 36 continue; 37 } 38 b[j]=a[i-1][j]; 39 b[j]%=k; 40 b[j]=k-b[j]; 41 b[j]%=k; 42 y+=b[j]; 43 } 44 if(f)return -1; 45 int z=n-i-y; 46 if(z<0||z%k)return -1; 47 return z; 48 } 49 50 51 int main(){ 52 //IO; 53 cin>>T; 54 while(T--){ 55 cin>>n>>k; 56 scanf("%s",s+1); 57 for(int i=1;i<=n;i++){ 58 for(int j=0;j<26;j++)a[i][j]=0; 59 } 60 for(int i=1;i<=n;i++){ 61 for(int j=0;j<26;j++){ 62 a[i][j]=a[i-1][j]; 63 } 64 int x=s[i]-'a'; 65 a[i][x]++; 66 } 67 int f2=0; 68 for(int i=0;i<26;i++){ 69 if(a[n][i]%k){ 70 f2=1; 71 break; 72 } 73 } 74 if(!f2){ 75 printf("%s\n",s+1); 76 continue; 77 } 78 int f=0; 79 for(int i=n;i>=1;i--){ 80 if(s[i]=='z')continue; 81 int x=s[i]-'a'; 82 int z=0,v=0; 83 for(int p=x+1;p<26;p++){ 84 z=check(i,p); 85 if(z!=-1){ 86 v=p; 87 f=1; 88 break; 89 } 90 } 91 if(!f)continue; 92 for(int j=1;j<i;j++)t[j]=s[j]; 93 t[i]=v+'a'; 94 for(int j=i+1;j<=i+z;j++){ 95 t[j]='a'; 96 } 97 int h=i+z; 98 for(int j=0;j<26;j++){ 99 for(int w=1;w<=b[j];w++){ 100 t[++h]=j+'a'; 101 } 102 } 103 break; 104 } 105 if(f){ 106 t[n+1]='\0'; 107 printf("%s\n",t+1); 108 } 109 else puts("-1"); 110 } 111 112 }
|
|