博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Revolving Digits
阅读量:4325 次
发布时间:2019-06-06

本文共 1518 字,大约阅读时间需要 5 分钟。

算法:

扩展KMP + KMP找循环节

View Code
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXN 300010using namespace std;char S[MAXN], T[MAXN];int next[MAXN];int extend[MAXN];int knext[MAXN];int L, E, G, len;void get_next( ){ int i = 0, j = 1, k = 1; len = strlen(T); next[0] = len; while( T[i] == T[i + k] ) i++; next[1] = i; for( int i = 2; i < len; i++) { if( i + next[i - k] < k + next[k] ) next[i] = next[i - k]; else { j = max(0, k + next[k] - i); while( T[j] == T[i + j] ) j++; next[k = i] = j; } } }//用KMP判断是否有循环节 void KMP( ){ int i = 0, j = -1; knext[0] = -1; while( i <= len ) { if( j == -1 || T[i] == T[j] ) { ++i, ++j; knext[i] = j; } else j = knext[j]; } // printf("len = %d knext[len] = %d\n",len,knext[len]); if( len - knext[len] != 0 && len - knext[len] != len && len % (len - knext[len]) == 0 ) { len = len - 1 - knext[len] + 1; //循环节长度 }}void solve( ){ int lenx = strlen(T); for( int i = 0; i < len; i++) { if( next[i] >= lenx ) E++; else if( S[next[i] + i] > S[next[i]] ) { G++; } else L++; } }int main( ){ int N, abc = 1; scanf("%d",&N); while( N-- ) { scanf("%s",T); strcpy(S,T); strcat(S,T); memset(next,0,sizeof(next)); memset(knext,0,sizeof(knext)); get_next( ); L = E = G = 0; KMP( ); solve( ); printf("Case %d: %d %d %d\n",abc++,L,E,G); } return 0;}

转载于:https://www.cnblogs.com/tangcong/archive/2012/08/08/2627835.html

你可能感兴趣的文章
进程和计划管理
查看>>
MQ_ActiveMQ环境部署+C#推送和接收消息
查看>>
Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
查看>>
学习笔记11.6
查看>>
高效中的细节注意
查看>>
MySQL 之 库操作
查看>>
Python 最抢手、Java 最流行,前线程序员揭秘 2019 软件开发现状
查看>>
R语言(一)
查看>>
商品搜索引擎---分词(插件介绍与入门实例)
查看>>
win7下硬盘安装Windows
查看>>
SQL Server 数据库性能优化(转载)
查看>>
java ee课程目标
查看>>
Shell 脚本进程并发&进程数控制
查看>>
Java基础String类
查看>>
yum -y list java* 查看当前java的版本
查看>>
Linux创建用户
查看>>
github中markdown语言的使用规则
查看>>
clean-css 安装 使用
查看>>
Java设计模式(Design Patterns In Java)读书摘要——第1章 绪论
查看>>
Linux下Nginx安装
查看>>