【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 }
null