思路:trie树。
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 3000
int n;
char a[maxn+5];
vector<int> Trie[2];
int cnt=0;
int f[maxn*maxn+5];
void dfs(int x) {
if(f[x]>1) printf("%d\n",f[x]);
if(Trie[0][x]) dfs(Trie[0][x]);
if(Trie[1][x]) dfs(Trie[1][x]);
}
int main() {
read(n);scanf("%s",a+1);
Trie[0].push_back(0),Trie[1].push_back(0);
for(int i=1;i<=n;i++) {
int p=0;
for(int j=i;j<=n;j++) {
if(a[j]=='1') {
if(Trie[1][p]) p=Trie[1][p];
else p=Trie[1][p]=++cnt,Trie[0].push_back(0),Trie[1].push_back(0);
f[p]++;
}
else {
if(Trie[0][p]) p=Trie[0][p];
else p=Trie[0][p]=++cnt,Trie[0].push_back(0),Trie[1].push_back(0);
f[p]++;
}
}
}
dfs(0);
return 0;
}