1. 程式人生 > >【KMP】【字串】BZOJ4974字串大師

【KMP】【字串】BZOJ4974字串大師

分析:

在KMP演算法中,failfail指標有一個特殊的性質,ifailii-fail_i是前i個字元的最小迴圈節大小。

所以這題相當於就是說,給了你每個點的fail指標,求一個滿足的字串。

那麼按照建fail指標的方式倒過來做就好了

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#define SF scanf
#define PF printf
#define MAXN 100010
using
namespace std; vector<int> a[MAXN]; int n; int fail[MAXN]; int used[MAXN]; char s[MAXN]; map<int,int> mp; int main(){ SF("%d",&n); for(int i=0;i<26;i++) mp[1<<i]=i; fail[0]=1; for(int i=1;i<=n;i++){ SF("%d",&fail[i]); fail[i]=i-fail[i]; } for(int i=0;i<n;
i++){ if(fail[i+1]!=0) s[i]=s[fail[i+1]-1]; else{ int mask=(~used[fail[i]]); int x=mp[mask&(-mask)]; s[i]='a'+x; } used[i]=(used[fail[i]]|(1<<(s[i]-'a'))); //PF("{%d %d}\n",used[i],fail[i]); } PF("%s",s); }