题目大意:给出一个32位的整数n,求该整数二进制数表达式中1的个数。
解题思路:
假设二进制表示n=01000100,则n-1 = 01000011
我们可以发现n&(n-1) = 01000000
所以,每次进行 n&(n-1) 的操作实质就是抹掉n最右边的1
或者可以将n转化为无符号整数后,直接调用C/C++自带的函数__builtin_popcount()得出
cout<<bitset<32>(n).count()<<endl;
G 关于字符串的问题
做法1:用manacher算法在O(n)的时间内求出所给字符串的最长回文子串,看长度是否大于1
做法2:观察易知,长的回文串中间必然包含短的回文串。
例如回文串abccba中间包含回文串bccb和cc,回文串abcba中间包含长度大于一的回文串bcb。
所以字符串的最长回文子串长度是1等价于不存在长度为2和为3的回文子串(如果长度>=2,那么必然包含为2 的或者为3的)。
不存在长度为2的回文子串→s[i]!=s[i+1]
不存在长度为3的回文子串→s[i]!=s[i+2]
循环所有的合法的i,都满足上述两条则最长回文子串长度为1,否则大于1.
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char s[N];
char s_new[2*N];
int p[N*2];
int init ()
{
int len=strlen(s);
s_new[0]='$';
s_new[1]='#';
int j=2;
for (int i=0;i<len;i++)
{
s_new[j++]=s[i];
s_new[j++]='#';
}
s_new[j]='\0';
return j;
}
int manacher()
{
int len=init();
int maxlen=-1;///最大回文串长度
int id;
int mx=0;
for (int i=1;i<len;i++)
{
if(i<mx)
p[i]=min(p[2*id-i