/**

* 需要理解题目本质:

* 循环 -> 重复 -> 节点再生

* 循环意味着会有重复的元素;

* 所以只要有重复的元素,就可以以这个元素为据点,往其前后填充缺省的不重复的部分,形成一个循环节;

* 就像《灵笼》中可再生的噬极兽。噬极兽身体每一部分都是单独的。噬极兽的脑袋被拔了,它可以以脑袋为节点,再生身体的其他部分。

*/

所以本质就是去重之后字符串的长度。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        let tokens = line.split(' ');
        /**
         * 需要理解题目本质:
         * 循环 -> 重复 -> 节点再生
         * 循环意味着会有重复的元素;
         * 所以只要有重复的元素,就可以以这个元素为据点,往其前后填充缺省的不重复的部分,形成一个循环节;
         * 就像《灵笼》中可再生的噬极兽。噬极兽身体每一部分都是单独的。噬极兽的脑袋被拔了,它可以以脑袋为节点,再生身体的其他部分。
         */
        let arr = new Set([...tokens[0]])
        console.log([...arr].length);
    }
}()