HDOJ3374 String Problem 【KMP最小循环节点】+【最小(大)表示法】
2014-05-03 17:43
309 查看
String Problem
[b]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1442 Accepted Submission(s): 645
[/b]
[align=left]Problem Description[/align]
Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings:
String Rank
SKYLONG 1
KYLONGS 2
YLONGSK 3
LONGSKY 4
ONGSKYL 5
NGSKYLO 6
GSKYLON 7
and lexicographically first of them is GSKYLON, lexicographically last is YLONGSK, both of them appear only once.
Your task is easy, calculate the lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), its times, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.
[align=left]Input[/align]
Each line contains one line the string S with length N (N <= 1000000) formed by lower case letters.
[align=left]Output[/align]
Output four integers separated by one space, lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), the string’s times in the N generated strings, lexicographically last string’s Rank (if there
are multiple answers, choose the smallest one), and its times also.
[align=left]Sample Input[/align]
abcder
aaaaaa
ababab
[align=left]Sample Output[/align]
1 1 6 1
1 6 1 6
1 3 2 3
#include <stdio.h> #include <string.h> #define maxn 1000002 char str[maxn]; int len, next[maxn]; void getNext(){ int i = 0, j = -1; next[0] = -1; while(i < len){ if(j == -1 || str[i] == str[j]){ ++i; ++j; next[i] = j; }else j = next[j]; } } int minR(){ int i = 0, j = 1, k = 0, t; while(i < len && j < len && k < len){ t = str[i+k >= len ? i+k-len : i+k] - str[j+k >= len ? j+k-len : j+k]; if(t == 0) ++k; else{ if(t > 0) i += k + 1; else j += k + 1; k = 0; if(i == j) ++j; } } return i < j ? i : j; } int maxR(){ int i = 0, j = 1, k = 0, t; while(i < len && j < len && k < len){ t = str[i+k >= len ? i+k-len : i+k] - str[j+k >= len ? j+k-len : j+k]; if(t == 0) ++k; else{ if(t > 0) j += k + 1; else i += k + 1; k = 0; if(i == j) ++j; } } return i < j ? i : j; } int main(){ int minlen, num; while(scanf("%s", str) == 1){ len = strlen(str); getNext(); if(len % (len - next[len]) == 0) //最小循环节点 minlen = len - next[len]; else minlen = len; num = len / minlen; printf("%d %d %d %d\n", minR()+1, num, maxR()+1, num); } return 0; }
相关文章推荐
- codeforces 427C Checkposts
- 做好网站内页
- 第九周项目五-一元二次方程类
- max num
- DM642视频采集程序注释
- POJ 1673 三角形垂心
- 获取输入法输入内容及后选项的钩子
- POJ 1106 Transmitters
- spring加载beans找不到声明
- 学起来就不觉得疲倦和无聊了~~
- 会场安排
- hashCode与equals的区别与联系
- Java中多线程之间数据共享
- Cocos2d-x3.0游戏实例《别救我》目录导航(共10篇,已完结)
- C语言实型数据
- PAT1024 BASIC:科学计数法 (20)
- oracl笔记
- 图形用户界面GUI
- 合唱队形_DP
- Java中的instanceof关键字