UVa455 Periodic String 的wronganswer问题探讨,以及AC的新思路
题目的意思是一个字符串有某个长度为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的新思路的更多相关文章
- UVa455 Periodic Strings
#include <stdio.h>#include <string.h> int main(){ int T, k, len; char str[81], *p, ...
- UVA455 - Periodic Strings(紫书习题3.4)
如果一个字符串可以被某个长度为k的字符串重复多次得到,则称这个字符串的周期为k.例如,字符串"abcabcabcabc"以3为周期(当然,他也以6.12等等为周期). 现在请你编 ...
- string.empty , "" , null 以及性能的比较
一:这种结论,个人觉得仍然存疑 http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html 1.null null 关 ...
- HDU——2093考试排名(string类及其函数的运用以及istringstream)
考试排名 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDOJ 1358
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ1961[KMP 失配函数]
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 16776 Accepted: 8077 Descripti ...
- POJ 1961 Period( KMP )*
Period Time Limit: 3000MSMemory Limit: 30000K Total Submissions: 12089Accepted: 5656 Description For ...
- [LA3026]Period
[LA3026]Period 试题描述 For each prefix of a given string S with N characters (each character has an ASC ...
- Period[HDU1358]
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- Linux上open-iscsi 的安装,配置和使用
关于open-iscsi open-iscsi是一个实现 RFC3720 iSCSI协议的高性能initiator程序.iSCSI使得访问SAN上的存储不再只能依赖Fibre Channel,也可以通 ...
- (转)java匿名内部类详解
原文:http://android.blog.51cto.com/268543/384844/ 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的 ...
- Java常用类之【Math类、Random类、System类、Runtime类】
一.Math类 Math类 [绝对值]Math.abs();//返回对应类型的绝对值 [最大值和最小值]Math.max(int a, int b) ,Math.min(int a,int b);(其 ...
- Ubuntu安装genymotion模拟器步骤
1.安装VitrualBox genymotion模拟器需要有VirtualBox环境,打开终端(ctrl + alt + T),执行以下命令: sudo apt-get install virtua ...
- 导入java项目时出现红色叹号问题的解决
问题:导入java项目时出现红色叹号(如下图所示) 原因:引入项目的某些jar包跟自己电脑上的位置不一样: 解决方案:步骤如下 (1)右键红色叹号所在项目————>build path————& ...
- Java中的框架基础面试知识
spring mvc 工作机制(原理): DispatcherServlet主要用作职责调度工作,本身主要用于控制流程 Spring mvc运行原理 1.springmvc将所有的请求都提交给Disp ...
- 基于android的语音识别
1.注册账户,添加应用 2.针对android平台的选择应用,下载SDK 3.将SDK的libs下文件拷贝到工程的libs目录下 4.添加用户权限 <uses-permission androi ...
- SQL中创建外键约束
alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)
- Log4PHP 配置和使用
Log4PHP2.3.0使用解释 1. 什么是Log4PHP Log4php它为apche组织维护项目,是Log4xx系列日志组件之一,log4j在JAVA中可算是大名鼎鼎的日志开发包.Log4PHP ...
- 如何在phpstorm中安装xdebug调试工具
用习惯了Visio Studio的调试工具,如果写个php用phpstorm没有调试工具,觉得还缺点什么.接下来就讲解一下如果安装xdebug,最好发现这个插件真好用! 1.下载xdebug.tar: ...