UVa 455 - Periodic Strings(字符串处理)

今天帮人Debug,实在看不懂他写的什么,就重写了一份给他。感觉学了这么久之后,再写这种水题轻松加随意,写得也比之前的好了。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<string.h>
int t;
char s[90];
int main(){
scanf("%d",&t);
while(t--){
scanf("%s",s);
int i,n=(int)strlen(s);
for(i=1;i<n;++i){
if(n%i) continue;
int ok=1,j=0,k=0;
for(;j<n&&ok;k%=i)
if(s[j++]!=s[k++]) ok=0;
if(ok) break;
}
printf("%d\n",i);
if(t) printf("\n");
}
return 0;
}

从昨天晚上开始做的,今天终于Ac了。题目是让输出输入的字符串的最小周期。开始使用了数组,当字符长度为n时,i从n-1开始自减,n%i=0时,建立数组a[ i][ n/i ];判断数组中对应值是否相等来输出i。可总是出问题,于是后来放弃数组,改为用j%i表示昨天数组中对应的值,并且使用x,y两个变量来限制多余的循 环,提交一次就Ac了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
#define maxn 100
int main()
{
int T,n,i,j,x,y;
scanf("%d",&T);
char s[maxn];
while(T--)
{
y=0;
scanf("%s",s);
n=strlen(s);
for(i=1;i<=n;i++)
{
if(n%i==0)
{
x=1;
for(j=i;j<n;j++)
{
if(x==0)
break;
if(s[j]!=s[j%i])
x=0;
}
if(x)
y=i;
}
if(y)
break;
}
if(T)
printf("%d\n\n",y);
else
printf("%d\n",y);
}
return 0;
}

** 本文迁移自我的CSDN博客,格式可能有所偏差。 **