这段代码不是用来判断某个特定字符是否在所有字符串中出现。
它是用来找出所有字符串中存在的字符数目。
以下是代码的分解:
int n, a = 0xfffffff;
cin >> n;
n是来自用户的输入参数,它确定了字符串的数量。假设n为3。
while (n
string s;
cin >> s;
int c = 0;
for (char ch : s)
c |= 1 << (ch - 'a');
a &= c;
}
这是代码的主要部分。
你会得到n个字符串,对于每个字符串,你需要将它由哪些字符组成存储在一个位数组中。
例如,假设第一个字符串是"stack",你需要循环遍历这些字符。
for (char ch : s)
c |= 1 << (ch - 'a');
c被初始化为每个字符串的0。
在这个例子中,“stack”,让我们看看c会发生什么
c = c | 1 <<('s' - 'a')=&gt; c = c | 1 << 18(c的第18位设置为1)
c = c | 1 <<('t' - 'a')=&gt; c = c | 1 << 19(c的第19位设置为1)
c = c | 1 <<('a' - 'a')=&gt; c = c | 1 << 0(c的0位设置为1)
c = c | 1 <<('c' - 'a')=&gt; c = c | 1 << 2(c的第2位设置为1)
c = c | 1 <<('k' - 'a')=&gt; c = c | 1 << 10(c的第10位设置为1)
请注意,1 << n表示1向左移动n位数字。所以1 << 3 = 0001 << 3 =二进制1000 = 2 ^ 3 = 8(如果您不理解移位,请参阅说明)
现在,c是一个整数,其0,2,10,18,19位设置为1。循环之前,a被初始化为所有1。
a&= c; 这会除去除0,2,10,18和19之外的所有1。
我们为所有字符串继续此操作。最后,a将在所有字符串中占用的位置上设置1位。
例如,如果第二个字符串是“aaaaa”
计算c会发现c只有它的0位设置。
a&= c; 这将除去除第0位外的所有1(即,它将第2、10、18和19位设置为0,因为它们不出现在“aaaaa”中)
而字符串3是“zzzzza”,最后,a的仅有的0位将被设置
因此,所有这些字符串中出现的字符数为1