http://oj.ecustacm.cn/problem.php?id=1480
dfs直接暴力
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
string str="0100110001010001";
int ans=0;
int a[16];//状态 1代表选 2代表不选 0代表还没考虑
map<string,bool>mp;
void dfs(int index)
{
if(index==16)
{
string s;
int i,j;
for(i=0;i<16;i++)
{
if(a[i]==1)//找到起始位置
{
break;
}
}
for(j=i;a[j]==1;j++)
{
s=s+str[j];
}
if(mp[s]==false)
{
mp[s]=true;
ans++;
}
return;
}
a[index]=1;//选
dfs(index+1);
a[index]=0;
a[index]=2;//不选
dfs(index+1);
a[index]=0;
}
int main(void)
{
dfs(0);
printf("%d\n",ans-1);//减1是因为空字串
return 0;
}
简单写法用:substr()函数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
using namespace std;
string str="0100110001010001";
int ans=0;
map<string,bool>mp;
int main(void)
{
int i,j;
for(i=0;i<str.size();i++)
{
for(j=1;j<=str.size();j++)
{
string s=str.substr(i,j);
if(mp[s])
{
continue;
}
else
{
ans++;
mp[s]=true;
}
}
}
printf("%d\n",ans);
return 0;
}
用set
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<set>
using namespace std;
set<string> st;
int main(void)
{
string a="0100110001010001";
int i,j;
for(i=0;i<a.size();i++)
{
for(j=i;j<a.size();j++)
{
st.insert(a.substr(i,j-i+1));
}
}
cout<<st.size()<<endl;
return 0;
}