题目的意思是一个字符串有某个长度为k的字符串通过不断重复形成的,而k被称为该字符串的周期。而我们所要做的是找出该字符串的最小周期。

input

The first line is an integer T,That means there are have T test cases; the following T lines are T strings;

output

Each line is an answer,and there a blank line between two answers.

(具体的题目描述请参考原题)

分析:在开始看到这个题目的时候,第一个想到的是从第一个字符开始找,开始假设最小周期min=1;只要对string进行一次遍历,并且在遍历的过程中,以min的间隔分别和字符串开头的min个字符进行比较,如果出现不相同,比如恰巧遍历到j位置,那么min就转化为j+1;启发源于:abcabcabcadcab,在d位置出现了不同,那么min=11;于是便得出了下面的代码:

#include<stdio.h>
#include<string.h>
int main()
{
int T;
char s[81];
int min,t,j,flag;
scanf("%d",&T);
//printf("\n");
for(int i=0;i<T;i++)
{
scanf("%s",s);
int l = strlen(s);
min=1;
for(j=1;j<l;j++)
{

t=j;

for(int k=0;k<min;k++)
{
if(t+k<l)
{

j=t+k;
if(s[k]!=s[j])
{
flag=0;
break;
}
}
}
t=t+min;
if(flag==0)
{
break;
}
}
if(flag==1)
{
break;
}

if(min>l/2)
{
min=l;
break;
}
}
}
if(i==T-1)
printf("%d\n",min);
else
printf("%d\n\n",min);
}
return 0;
}

在一开始,觉得这个思路应该是比较正确的,不会有什么不妥,然而提交的结果是Wronganswer,尽管后期对细节进行了处理,比如周期超过l/2则周期为l;但是都没有通过。

因为wweewwwweeww,这个字符串用上面的思路是绝对行不通的。因此可以肯定上面的wronganswer是思路上错了。

那么可以确保正确的思路又是怎么样的呢?

1.比较明显的特点,周期min必定是strlen(s)的因子,而且是最小的,因此利用一个循环从小到大对strlen(s)的因子进行判定是否符合条件即可,其中需要花些心思的是如何进行判定周期是符合条件的。其实,只要将之后的每一段和第一段进行比较或者在之后的每一段的每个字符进行比较,第一个循环为每个字符的循环,嵌套一个是否相等的循环,用一个flag进行标记,方便外循环的break,因为只要有内循环出现不相等,则外循环之后都不需要进行比较了。

代码应该表较容易写出来。

2.是在第一种思路上和错误的思路相结合的方式。每个循环,其第一个字符必定和s[0],是相等的,因此只要再加上s[j]==s[0]&&l%j==0可以个快速的进行判定。

具体代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
int T;
char s[81];
int min,t,j,flag;
scanf("%d",&T);
//printf("\n");
for(int i=0;i<T;i++)
{
scanf("%s",s);
int l = strlen(s);
min=1;
for(j=1;j<l;j++)
{
if(s[j]==s[0]&&l%j==0)
{
min=j;
t=j;
//printf("%d",min);

while(t<=l-min)
{
flag=1;
for(int k=0;k<min;k++)
{
if(t+k<l)
{
if(s[k]!=s[t+k])
{
flag=0;
break;
}
}
}
t=t+min;
if(flag==0)
{
break;
}
}
if(flag==1)
{
break;
}

if(min>l/2)
{
min=l;
break;
}
}
}
if(j>=l)
{
min=l;
}
if(i==T-1)
printf("%d\n",min);
else
printf("%d\n\n",min);
}
return 0;
}

最后,只得一说的是原题在INPUT的内容里加上了T...followed by a blank line,其实并没有起到任何作用,别管就是。在输出时也要注意下输出格式题目就可以解决了。

UVa455 Periodic String 的wronganswer问题探讨,以及AC的新思路的更多相关文章

  1. UVa455 Periodic Strings

    #include <stdio.h>#include <string.h> int main(){    int T, k, len;    char str[81], *p, ...

  2. UVA455 - Periodic Strings(紫书习题3.4)

    如果一个字符串可以被某个长度为k的字符串重复多次得到,则称这个字符串的周期为k.例如,字符串"abcabcabcabc"以3为周期(当然,他也以6.12等等为周期).  现在请你编 ...

  3. string.empty , "" , null 以及性能的比较

    一:这种结论,个人觉得仍然存疑 http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html 1.null    null 关 ...

  4. HDU——2093考试排名(string类及其函数的运用以及istringstream)

    考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. HDOJ 1358

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  6. POJ1961[KMP 失配函数]

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 16776   Accepted: 8077 Descripti ...

  7. POJ 1961 Period( KMP )*

    Period Time Limit: 3000MSMemory Limit: 30000K Total Submissions: 12089Accepted: 5656 Description For ...

  8. [LA3026]Period

    [LA3026]Period 试题描述 For each prefix of a given string S with N characters (each character has an ASC ...

  9. Period[HDU1358]

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. 使用ConcurrentDictionary替代Hashtable对多线程的对象缓存处理

    在之前一段时间里面,我的基类多数使用lock和Hashtable组合实现多线程内缓存的冲突处理,不过有时候使用这两个搭配并不尽如人意,偶尔还是出现了集合已经加入的异常,对代码做多方的处理后依然如故,最 ...

  2. 利用wget检测网页是否正常访问

    #!/bin/bash function CheckUrl() { timeout=5 fails=0 success=0 while true do wget --timeout=5 --tries ...

  3. unittest模块的常用方法:

    unittest模块的常用方法: assertEqual(a, b)     a == b assertNotEqual(a, b)     a != b assertTrue(x)     bool ...

  4. 面向对象(java菜鸟的课堂笔记)

    类:相同的东西放在一起 分为属性和动作: 把一组或多组事物相同的特性的描述==>类   属性和动作被称为成员: //声明类的属性信息 public class **{ String name: ...

  5. nodejs 开发指南 书中小项目 代码

    最近 在学习node.js 先看了下语法 ,然后就看这个开发指南感觉书还是很有用,但是代码太旧了,网上也没有最新的,所以就自己查着前人的痕迹和自己修改,现在可以跑了. https://github.c ...

  6. node.js 开发环境配置 和使用方式

    1.在根目录创建一个文件夹 里面 放入js 编写完成后使用 cmd  进行编译就可以了2.expree 安装    卸载: npm uninstall -g express 安装指定版本: npm i ...

  7. XWindow启动流程

    X Window系统架构 一.基本概念: 1.X Client:X客户端,运行在远端主机上 X Client最重要的工作就是处理来自 X Server 的动作,将该动作处理成为绘图数据, 再将这些绘图 ...

  8. SQL之trigger(触发器)

    先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...

  9. 微信小程序 - 自定义创建

    自定义创建与默认创建完全相同, 只是不要勾选quick start即可 淡定(不要看到报错就紧张, 一定要淡定) 看看它说了什么, no such file or directory(没有文件或目录) ...

  10. thinkphp获取特定字段的两种方法

    thinkphp getField( )和field( ) 2014年10月05日 ⁄ 综合 ⁄ 共 1509字 ⁄ 字号 小 中 大 ⁄ 评论关闭 做数据库查询的时候,比较经常用到这两个,总是查手册 ...