题解 P5832 【[USACO19DEC]Where Am I?我在哪】

· · 题解

第一眼看到题目时,我内心欣喜万分:太好了,终于有一道水题可刷了!于是我就开开心心地提交了求这个字符串里出现不同字母的个数的代码(样例过的了)。

结果...10分(代码就不贴了,防止你们说我傻)。

我便开始重新看题目:

我在这篇文章里暂且称“ABC”那样有两个(或以上)完全相等的东西为“小字符串”。可以得出,当小字符串长度=3时,k=4。所以我们就要求出最长的小字符串的长度,并且加一后输出。

```cpp #include<bits/stdc++.h> using namespace std; int n,s,m; char a[250]; void c(int i,int j) { if(a[i]==a[j])//判断这两个字母是否相同 (如果相同,小字符串的位数+1) { s++; c(i+1,j+1);//接着看下一个字母是否相同 } } int main() { scanf("%d",&n); for(int z=1;z<=n;z++) cin>>a[z]; for(int w=1;w<=n;w++)//二重循环,数据够小,不怕超时 { for(int b=w+1;b<=n;b++)// 注意这里b要等于w+1,不然会一直相等(就会等同于“w=w”) { s=0;//统计当前的相同的小字符串里所包含的字母数 c(w,b);//自定义函数寻找最长的两个小字符串 if(s>m) m=s;//如果这个小字符串里字母的数量超过最大值,最大值更新 } } printf("%d",m+1);//因为最大的相等的小字符串有两个(及以上),所以需要加一。 return 0; } ``` [顺便安利一下我的bolg](https://ptemma-250.blog.luogu.org/#)