bzoj4974: [Lydsy1708月賽]字串大師
阿新 • • 發佈:2018-11-08
nex[i] = i - pre[i]//pre[]為i所在的迴圈節長度。
前面確定了來推後面
如果nex[i] != 0的話,那麼i位置上的字元和j位置上的字元一樣
如果nex[i] == 0的話,i位置上的字元就要和所有有可能使nex[i] != 0的位置上的字元不一樣。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n, nex[100005], vis[30]; char a[100005]; int main() { cin >> n; nex[0] = -1; for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); nex[i] = i - x; } for(int i = 1; i <= n; i++) { if(nex[i] != 0) { a[i] = a[nex[i]]; } else { memset(vis,0,sizeof(vis)); int k = nex[i-1] + 1; while(k) { vis[a[k] - 'a'] = 1; k = nex[k-1] + 1; } for(int j = 0 ; j <= 25; j++) if(vis[j] == 0) { a[i] = 'a' + j; break; } } } for(int i = 1; i <= n; i++) { printf("%c",a[i]); } return 0; }