hpuoj1695 一道签到题【KMP】

来源:互联网 发布:不要网络的极品时刻表 编辑:程序博客网 时间:2024/05/21 09:35

1695: 一道签到题

时间限制: 2 Sec  内存限制: 128 MB
提交: 69  解决: 33
[提交][状态][讨论版]

题目描述

我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度

输入

输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100

输出

分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔

样例输入

8.69876987698769870.6665.1

样例输出

4 6987 41 6 31 1 1
【代码】
#include<stdio.h> #include<string.h> char a[220],b[220]; int p[220]; int len,len1,k; void getp() {     int i=0,j=-1;     p[i]=j;     while(i<len1)     {         if(j==-1||b[i]==b[j])         {             i++,j++;             p[i]=j;         }         else        j=p[j];     } } int main() {     while(scanf("%s",a)!=EOF)     {         int i,j=0;         len=strlen(a);         for(i=0;i<len;i++)         {             if(a[i]=='.')                k=i;         }         for(i=len-1;i>k;i--)         {             b[j++]=a[i];             len1=j;         }         getp();         printf("%d ",len1-p[len1]);         for(i=len1-p[len1]-1;i>=0;i--)            printf("%c",b[i]);         printf(" %d\n",len1/(len1-p[len1]));     }     return 0; } 

0 0
原创粉丝点击