标签:span output 条件 直接 set clu 数据 name 字典序
Input
Output
Sample Input
5 1 2 2 2 5
Sample Output
ababb
题解:
规律都是自己手玩出来的,显然看到这个题目就想着这个字符串是确定的,那么出来i号字符时,i前面都是处理出来的,而你又知道他的循环节,如果是小于i的话就直接对应上去就好了,如果=i,我只会n^2的,看了题解,只要模仿kmp,把每个可能的循环节枚举出来,然后把字母判掉,之后最小的字母就是答案了。
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #define MAXN 100010 using namespace std; int a[MAXN],vis[28],n; char s[MAXN]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); s[1]=‘a‘; for(int i=2;i<=n;i++){ if(i!=a[i]) s[i]=s[(i-1)%a[i]+1]; else{ memset(vis,0,sizeof(vis)); int hh=i-1; while(hh!=a[hh]){ hh=(hh-1)%a[hh]+1; vis[s[hh+1]-‘a‘]=1; } for(int j=1;j<26;j++){ if(!vis[j]) {s[i]=‘a‘+j;break;} } } } s[n+1]=0; printf("%s",s+1); return 0; }
标签:span output 条件 直接 set clu 数据 name 字典序
原文地址:http://www.cnblogs.com/renjianshige/p/7577526.html