Revolving Digits
题意:给一串数字,每次可以把最后一个移到最前面形成一个新的数字,问所有的数字中有多少比原数大、小、相等。
原数字为s,长度为len,那么一共形成len数字。
令t=s+s(连接),接下来利用扩展KMP找到t[i]对应的extend[i],然后去和s分三种情况比较。
需要注意的是如果s串是一个循环的串,那么要减去重复的数字,这里用到可KMP,len-nex[len]是循环节的长度。
1 #include2 using namespace std; 3 const int maxn=200010; 4 char s[maxn],t[maxn]; 5 int nex[maxn],ex[maxn]; 6 int lens,lent; 7 int f[maxn]; 8 void getnex(char* t){ 9 nex[0]=lent;10 int a=0,p=0;11 for(int i=1;i =p||i+nex[i-a]>=p){13 if(i>=p) p=i;14 while(p =p||i+nex[i-a]>=p){28 if(i>=p) p=i;29 while(i =lent) b++;63 else if(s[i+ex[i]] t[ex[i]]) c++;65 }66 printf(" %d %d %d\n",a/temp,b/temp,c/temp);67 }68 }