public void InputChar(char input){
		
		if (mSwapChainCounter == Integer.MAX_VALUE){
			for (int i = 0; i < mStates.size(); ++i){
				mStates.get(i).mSwapChainCode = 0;
			}
			mSwapChainCounter = 1;
		}
		else{
			++mSwapChainCounter;
		}
		
		for (Iterator<State> itr = mCurrentStates.iterator(); itr.hasNext();){
			State temp = itr.next();
			if (temp.mTransitions.containsKey(input)){
				List<State> newStates = temp.mTransitions.get(input);
				for (int j = 0; j < newStates.size(); ++j){
					if (newStates.get(j).mSwapChainCode != mSwapChainCounter){ // already added
						mNotCurrentStates.add(newStates.get(j));
						newStates.get(j).mSwapChainCode = mSwapChainCounter;
					}
				}
			}
			itr.remove(); // remove from mCurrentStates
		}
		
		// swap states
		List<State> temp = mCurrentStates;
		mCurrentStates = mNotCurrentStates;
		mNotCurrentStates = temp;
		mIsReset = false;
	}