HDU - 3374 String Problem (最大最小值表示法+kmp)

https://vjudge.net/contest/189927#problem/M


题意:字符串的第一个会变到最后一个,之后有一个顺序,第一次变化是第一名,第二次变化是第二名,然后问你字典序最小和字典序最大的串在第几名,它出现的次数是多少

思路:出现的次数好算,因为一个串出现的次数就是len/(len-nex[len])吗,现在就是看他是第几位比较难,其实也不难就是看一个字符在字符串中的大

#include 
#include 
#include  
using namespace std;
const int maxn = 1e6+10;
char ch[maxn];
int nex[maxn],cnt[26];
void pre_kmp(char str[])
{
	memset(nex,0,sizeof(nex));
	int len = strlen(str) , i = 0 , k = -1;
	nex[0] = -1;
	while( i < len )
	{
		if( k == -1 || str[i] == str[k])
		{
			i++,k++;
			nex[i] = k;
		}
		else 
		{
			k = nex[k];
		}
	}
}
int Min_MAX(char str[],int flag)
{
	int i = 0 , j = 1 , k = 0;
	int len = strlen(str);
	while( i

小位置就好了,这里就用到最大最小表示法,(表示自己并不是很会用= =。。过几天在在写一篇吧)上代码:


你可能感兴趣的:(HDU - 3374 String Problem (最大最小值表示法+kmp))