HDU 6761 Minimum Index(Lyndon分解)

题目链接
题意:
求一个字符串每个前缀的最小后缀的下标。
思路:
可以使用Lyndon分解来做。因为一个字符串进行Lyndon分解后,最小的后缀一定是最后一个Lyndon串。
在运行Duval算法求Lyndon分解的过程中,每次在最后加入一个字符,我们就可以求出以该字符结尾的前缀的最小后缀。

cin string t死我了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector> 
#include<iostream>
using namespace std;
#define Max_N 1000010
#define ll long long
const ll mod=1e9+7;
ll ans[Max_N];
char s[Max_N];
int n;
void duval() {
  int  i = 0;
  while (i < n) {
  	ans[i]=i;
    int j = i + 1, k = i;
    while (j < n && s[k] <= s[j]) {
      if (s[k] < s[j]){
        k = i;
        ans[j]=i;
    	}
      else{
       
        ans[j]=ans[k]+j-k; 
		k++;
    	}
      j++;
    }
    while (i <= k) {
      i += j - k;
    }
  }
}   
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s);
		n=strlen(s);
		duval();
		ll bas=1,sum=0;
		for(ll i=0;i<n;i++)
		{
		//	printf("%lld ",ans[i]+1);
			(sum+=(bas*(ans[i]+1))%mod)%=mod;
            (bas*=1112ll)%=mod;
		}
	//	printf("\n");
		printf("%lld\n",sum);
	}
}
posted @ 2020-10-13 21:08  Ldler  Views(76)  Comments(0Edit  收藏  举报