【CF1073A】Diverse Substring(签到)

题意:给定一个由小写字母组成的串,要求找出一个子串使得其中出现最多的字母不超过它长度的一半下取整

n<=1e3

思路:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N   11000
21 #define MOD 1000000007
22 #define eps 1e-8 
23 #define pi acos(-1)
24 
25 int s[N][30];
26 char ch[N];
27 
28 int main()
29 {
30     int n;
31     scanf("%d",&n);
32     scanf("%s",ch+1);
33     for(int i=1;i<=n;i++)
34     {
35         for(int j=1;j<=26;j++) s[i][j]=s[i-1][j];
36         s[i][ch[i]-'a'+1]++;
37     }
38     int x=0; 
39     int y=0; 
40     for(int i=1;i<=n;i++)
41      for(int j=i;j<=n;j++)
42       if(x+y==0)
43       {
44              int len=j-i+1;
45              int tmp=0;
46              for(int k=1;k<=26;k++) tmp=max(tmp,s[j][k]-s[i-1][k]);
47              if(tmp<=len/2){x=i; y=j;}
48       }
49     
50     if(x+y>0)
51     {
52         printf("YES\n");
53         for(int i=x;i<=y;i++) printf("%c",ch[i]);
54     }
55      else printf("NO\n");
56     return 0;
57 }

猜你喜欢

转载自www.cnblogs.com/myx12345/p/9853775.html